AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Unit Class Referenceabstract

#include "Unit.h"

Inheritance diagram for Unit:
WorldObject Object WorldLocation Position Creature Player TempSummon Minion Guardian Puppet Totem Pet

Public Types

typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::list< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 ~Unit () override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
void Update (uint32 time) override
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 
bool AttackStop ()
 
void RemoveAllAttackers ()
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
bool CanFreeMove () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
uint32 GetResistance (SpellSchools school) const
 
uint32 GetResistance (SpellSchoolMask mask) const
 
void SetResistance (SpellSchools school, int32 val)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
float GetHealthPct () const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
float GetPowerPct (Powers power) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
int32 GetHealthGain (int32 dVal)
 
Powers getPowerType () const
 
void setPowerType (Powers power)
 
virtual bool HasActivePowerType (Powers power)
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 
void RemoveUnitFlag (UnitFlags flags)
 
void ReplaceAllUnitFlags (UnitFlags flags)
 
UnitFlags2 GetUnitFlags2 () const
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint32 GetFaction () const
 
void SetFaction (uint32 faction)
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
bool IsContestedGuard () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
void HandleEmoteCommand (uint32 emoteId)
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
bool CanUseAttackType (uint8 attacktype) const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
NPCFlags GetNpcFlags () const
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
bool IsCritter () const
 
bool IsInFlight () const
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
virtual bool HasSpell (uint32) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
bool HasStealthAura () const
 
bool HasInvisibilityAura () const
 
bool isFeared () const
 
bool isInRoots () const
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
void DeMorph ()
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client. More...
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client. More...
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
void SendMovementFlagUpdate (bool self=false)
 
virtual bool SetWalk (bool enable)
 
virtual bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true)
 
virtual bool SetSwim (bool enable)
 
virtual bool SetCanFly (bool enable, bool packetOnly=false)
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 
virtual bool SetFeatherFall (bool enable, bool packetOnly=false)
 
virtual bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
PlayerGetSpellModOwner () const
 
UnitGetOwner () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
PlayerGetAffectingPlayer () const
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void SetCharm (Unit *target, bool apply)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void RemoveCharmedBy (Unit *charmer)
 
void RestoreFaction ()
 
UnitGetFirstControlled () const
 
void RemoveAllControlled (bool onDeath=false)
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
void DeleteCharmInfo ()
 
void UpdateCharmAI ()
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
void RemoveBindSightAuras ()
 
void RemoveCharmAuras ()
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
void InitStatBuffMods ()
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
void SetCreateStat (Stats stat, float val)
 
void SetCreateHealth (uint32 val)
 
uint32 GetCreateHealth () const
 
void SetCreateMana (uint32 val)
 
uint32 GetCreateMana () const
 
uint32 GetCreatePowers (Powers power) const
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
float GetCreateStat (Stats stat) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool IsMovementPreventedByCasting () const
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsInFeralForm () const
 
bool IsInDisallowedMountForm () const
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
bool CanModifyStats () const
 
void SetCanModifyStats (bool modifyStats)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
bool CanHaveThreatList () const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
void UnsummonAllTotems (bool onDeath=false)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------— More...
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 --------—Combo point system----------------— More...
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void SendComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------— More...
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void propagateSpeedChange ()
 -------—End of Pet responses methods-------— More...
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
void UpdateAuraForGroup (uint8 slot)
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId) const
 
uint32 GetModelForTotem (PlayerTotemType totemType)
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
ObjectGuid GetTransGUID () const override
 
TransportBaseGetDirectTransport () const
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle) More...
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void BuildMovementPacket (ByteBuffer *data) const
 
virtual bool CanSwim () const
 this method checks the current flag of a unit More...
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
float GetHoverHeight () const
 
virtual bool CanEnterWater () const =0
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
virtual float GetFollowAngle () const
 
void OutDebugInfo () const
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
bool CanApplyResilience () const
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, Unit *caster) const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
float GetCollisionHeight () const override
 Return collision height sent to client. More...
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC More...
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
std::string GetDebugInfo () const override
 
uint32 GetOldFactionId () const
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
virtual void Update (uint32)
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
virtual float GetCombatReach () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
virtual void SetPhaseMask (uint32 newPhaseMask, bool update)
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void CleanupsBeforeDelete (bool finalCleanup=true)
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
virtual uint8 getLevelForTarget (WorldObject const *) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
void DestroyForNearbyPlayers ()
 
virtual void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false)
 
void BuildUpdate (UpdateDataMapType &data_map, UpdatePlayerSet &player_set) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
bool IsFarVisible () const
 
bool IsVisibilityOverridden () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
void SetWorldObject (bool apply)
 
bool IsPermanentWorldObject () const
 
bool IsWorldObject () const
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
virtual ObjectGuid GetTransGUID () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim. More...
 
virtual float GetCollisionHeight () const
 
virtual float GetCollisionWidth () const
 
virtual float GetCollisionRadius () const
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
virtual void AddToWorld ()
 
virtual void RemoveFromWorld ()
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
virtual uint32 GetDynamicFlags () const
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
virtual void ReplaceAllDynamicFlags (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
virtual void BuildUpdate (UpdateDataMapType &, UpdatePlayerSet &)
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual std::string GetDebugInfo () const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
std::string ToString () const
 

Static Public Member Functions

static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

uint32 m_extraAttacks
 
bool m_canDualWield
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
EventProcessor m_Events
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ElunaEventProcessor * elunaEvents
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Protected Types

typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

 Unit (bool isWorldObject)
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool isStun=false)
 
- Protected Member Functions inherited from WorldObject
 WorldObject (bool isWorldObject)
 
virtual void ProcessPositionDataChanged (PositionFullTerrainStatus const &data)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsAlwaysVisibleFor (WorldObject const *) const
 
virtual bool IsInvisibleDueToDespawn () const
 
virtual bool IsAlwaysDetectableFor (WorldObject const *) const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
virtual void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target)
 
virtual void AddToObjectUpdate ()=0
 
virtual void RemoveFromObjectUpdate ()=0
 
void AddToObjectUpdateIfNeeded ()
 

Protected Attributes

UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
uint32 m_rootTimes
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
bool m_isFarVisible
 
Optional< float > m_visibilityDistanceOverride
 
const bool m_isWorldObject
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union {
   int32 *   m_int32Values
 
   uint32 *   m_uint32Values
 
   float *   m_floatValues
 
}; 
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef std::unordered_map< uint64, BuildValuesCachedBufferValuesUpdateCache
 

Private Member Functions

bool IsTriggeredAtSpellProcEvent (Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
 
bool HandleDummyAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
 
bool HandleAuraProc (Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
 
bool HandleProcTriggerSpell (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
 
bool HandleOverrideClassScriptAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
 
bool HandleAuraRaidProcFromChargeWithValue (AuraEffect *triggeredByAura)
 
bool HandleAuraRaidProcFromCharge (AuraEffect *triggeredByAura)
 
void UpdateSplineMovement (uint32 t_diff)
 
void UpdateSplinePosition ()
 
float GetCombatRatingReduction (CombatRating cr) const
 
uint32 GetCombatRatingDamageReduction (CombatRating cr, float rate, float cap, uint32 damage) const
 
void PatchValuesUpdate (ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
 
void InvalidateValuesUpdateCache ()
 
float processDummyAuras (float TakenTotalMod) const
 

Private Attributes

uint32 m_state
 
uint32 m_CombatTimer
 
uint32 m_lastManaUse
 
Diminishing m_Diminishing
 
HostileRefMgr m_HostileRefMgr
 
FollowerRefMgr m_FollowingRefMgr
 
Unitm_comboTarget
 
int8 m_comboPoints
 
std::unordered_set< Unit * > m_ComboPointHolders
 
RedirectThreatInfo _redirectThreatInfo
 
bool m_cleanupDone
 
bool m_duringRemoveFromWorld
 
uint32 _oldFactionId
 faction before charm More...
 
bool _isWalkingBeforeCharm
 Are we walking before we were charmed? More...
 
uint32 _lastExtraAttackSpell
 
std::unordered_map< ObjectGuid, uint32extraAttacksTargets
 
ObjectGuid _lastDamagedTargetGuid
 
ValuesUpdateCache _valuesUpdateCache
 

Detailed Description

Member Typedef Documentation

◆ AttackerSet

typedef std::unordered_set<Unit*> Unit::AttackerSet

◆ AuraApplicationList

◆ AuraApplicationMap

◆ AuraApplicationMapBounds

typedef std::pair<AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator> Unit::AuraApplicationMapBounds

◆ AuraApplicationMapBoundsNonConst

typedef std::pair<AuraApplicationMap::iterator, AuraApplicationMap::iterator> Unit::AuraApplicationMapBoundsNonConst

◆ AuraEffectList

typedef std::list<AuraEffect*> Unit::AuraEffectList

◆ AuraList

typedef std::list<Aura*> Unit::AuraList

◆ AuraMap

typedef std::multimap<uint32, Aura*> Unit::AuraMap

◆ AuraMapBounds

typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> Unit::AuraMapBounds

◆ AuraMapBoundsNonConst

typedef std::pair<AuraMap::iterator, AuraMap::iterator> Unit::AuraMapBoundsNonConst

◆ AuraStateAurasMap

◆ AuraStateAurasMapBounds

typedef std::pair<AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator> Unit::AuraStateAurasMapBounds

◆ CharmThreatMap

typedef std::map<ObjectGuid, float> Unit::CharmThreatMap
protected

◆ ComboPointHolderSet

◆ ControlSet

typedef std::set<Unit*> Unit::ControlSet

◆ Diminishing

◆ DynObjectList

typedef std::list<DynamicObject*> Unit::DynObjectList
protected

◆ GameObjectList

typedef GuidList Unit::GameObjectList
protected

◆ PetAuraSet

typedef std::set<PetAura const*> Unit::PetAuraSet

◆ ValuesUpdateCache

typedef std::unordered_map<uint64 , BuildValuesCachedBuffer> Unit::ValuesUpdateCache
private

◆ VisibleAuraMap

Constructor & Destructor Documentation

◆ ~Unit()

Unit::~Unit ( )
override
340{
341 // set current spells as deletable
342 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
343 if (m_currentSpells[i])
344 {
346 m_currentSpells[i] = nullptr;
347 }
348
350
351 delete i_motionMaster;
352 delete m_charmInfo;
353 delete movespline;
354
357 ASSERT(m_attackers.empty());
358
359 // pussywizard: clear m_sharedVision along with back references
360 if (!m_sharedVision.empty())
361 {
362 do
363 {
364 Player* p = *(m_sharedVision.begin());
365 p->m_isInSharedVisionOf.erase(this);
366 m_sharedVision.remove(p);
367 } while (!m_sharedVision.empty());
368 }
369
370 ASSERT(m_Controlled.empty());
371 ASSERT(m_appliedAuras.empty());
372 ASSERT(m_ownedAuras.empty());
373 ASSERT(m_removedAuras.empty());
374 ASSERT(m_gameObj.empty());
375 ASSERT(m_dynObj.empty());
376
377 if (m_movedByPlayer && m_movedByPlayer != this)
378 LOG_INFO("misc", "Unit::~Unit (A1)");
379
381}
#define LOG_INFO(filterType__,...)
Definition: Log.h:164
#define ASSERT
Definition: Errors.h:68
std::uint8_t uint8
Definition: Define.h:109
#define CURRENT_MAX_SPELL
Definition: Unit.h:544
Definition: Player.h:1063
std::set< Unit * > m_isInSharedVisionOf
Definition: Player.h:2311
bool m_duringRemoveFromWorld
Definition: Unit.h:1934
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition: Unit.h:1843
AuraList m_removedAuras
Definition: Unit.h:1847
ControlSet m_Controlled
Definition: Unit.h:1209
Movement::MoveSpline * movespline
Definition: Unit.h:1782
CharmInfo * m_charmInfo
Definition: Unit.h:1864
MotionMaster * i_motionMaster
Definition: Unit.h:1867
void _DeleteRemovedAuras()
Definition: Unit.cpp:3795
DynObjectList m_dynObj
Definition: Unit.h:1837
SafeUnitPointer m_movedByPlayer
Definition: Unit.h:1230
AttackerSet m_attackers
Definition: Unit.h:1829
Unit * m_attacking
Definition: Unit.h:1830
GameObjectList m_gameObj
Definition: Unit.h:1840
AuraMap m_ownedAuras
Definition: Unit.h:1845
AuraApplicationMap m_appliedAuras
Definition: Unit.h:1846
static void HandleSafeUnitPointersOnDelete(Unit *thisUnit)
Definition: Unit.cpp:4287
SharedVisionList m_sharedVision
Definition: Unit.h:1865
void SetReferencedFromCurrent(bool yes)
Definition: Spell.h:559

References _DeleteRemovedAuras(), ASSERT, CURRENT_MAX_SPELL, HandleSafeUnitPointersOnDelete(), i_motionMaster, LOG_INFO, m_appliedAuras, m_attackers, m_attacking, m_charmInfo, m_Controlled, m_currentSpells, m_duringRemoveFromWorld, m_dynObj, m_gameObj, Player::m_isInSharedVisionOf, m_movedByPlayer, m_ownedAuras, m_removedAuras, m_sharedVision, movespline, and Spell::SetReferencedFromCurrent().

◆ Unit()

Unit::Unit ( bool  isWorldObject)
explicitprotected
204 : WorldObject(isWorldObject),
205 m_movedByPlayer(nullptr),
207 IsAIEnabled(false),
208 NeedChangeAI(false),
210 m_CreatedByPlayer(false),
212 i_AI(nullptr),
213 i_disabledAI(nullptr),
214 m_realRace(0),
215 m_race(0),
217 m_procDeep(0),
219 i_motionMaster(new MotionMaster(this)),
220 m_regenTimer(0),
221 m_ThreatMgr(this),
222 m_vehicle(nullptr),
223 m_vehicleKit(nullptr),
225 m_HostileRefMgr(this),
226 m_comboTarget(nullptr),
228{
229#ifdef _MSC_VER
230#pragma warning(default:4355)
231#endif
234
236
243
244 m_canDualWield = false;
245
246 m_rootTimes = 0;
247
248 m_state = 0;
249 m_deathState = DeathState::Alive;
250
251 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
252 m_currentSpells[i] = nullptr;
253
254 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
255 m_SummonSlot[i].Clear();
256
257 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
258 m_ObjectSlot[i].Clear();
259
261
262 m_interruptMask = 0;
263 m_transform = 0;
264 m_canModifyStats = false;
265
266 for (uint8 i = 0; i < MAX_SPELL_IMMUNITY; ++i)
267 m_spellImmune[i].clear();
268
269 for (uint8 i = 0; i < UNIT_MOD_END; ++i)
270 {
275 }
276 // implement 50% base damage from offhand
278
279 for (uint8 i = 0; i < MAX_ATTACK; ++i)
280 {
283
284 m_weaponDamage[i][MINDAMAGE][1] = 0.f;
285 m_weaponDamage[i][MAXDAMAGE][1] = 0.f;
286 }
287
288 for (uint8 i = 0; i < MAX_STATS; ++i)
289 m_createStats[i] = 0.0f;
290
291 m_attacking = nullptr;
292 m_modMeleeHitChance = 0.0f;
294 m_modSpellHitChance = 0.0f;
296
297 m_CombatTimer = 0;
298 m_lastManaUse = 0;
299
300 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
301 m_threatModifier[i] = 1.0f;
302
303 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
304 m_speed_rate[i] = 1.0f;
305
306 m_charmInfo = nullptr;
307
309
310 // remove aurastates allowing special moves
311 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
312 m_reactiveTimer[i] = 0;
313
314 m_cleanupDone = false;
316
318
319 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
324
325 m_applyResilience = false;
326 _instantCast = false;
327
328 _lastLiquid = nullptr;
329
330 _oldFactionId = 0;
331
332 _isWalkingBeforeCharm = false;
333
335}
@ UNIT_MASK_NONE
Definition: UnitDefines.h:134
#define MAX_MOVE_TYPE
Definition: UnitDefines.h:339
@ MINDAMAGE
Definition: Unit.h:135
@ MAXDAMAGE
Definition: Unit.h:136
@ UNIT_MOD_DAMAGE_OFFHAND
Definition: Unit.h:166
@ UNIT_MOD_END
Definition: Unit.h:168
#define MAX_SUMMON_SLOT
Definition: Unit.h:601
@ OFF_ATTACK
Definition: Unit.h:210
@ MAX_ATTACK
Definition: Unit.h:212
@ BASE_ATTACK
Definition: Unit.h:209
@ RANGED_ATTACK
Definition: Unit.h:211
@ BASE_VALUE
Definition: Unit.h:126
@ TOTAL_VALUE
Definition: Unit.h:128
@ TOTAL_PCT
Definition: Unit.h:129
@ BASE_PCT
Definition: Unit.h:127
#define BASE_MAXDAMAGE
Definition: Unit.h:40
@ MAX_REACTIVE
Definition: Unit.h:593
#define MAX_GAMEOBJECT_SLOT
Definition: Unit.h:603
#define BASE_MINDAMAGE
Definition: Unit.h:39
@ TYPEID_UNIT
Definition: ObjectGuid.h:35
@ TYPEMASK_UNIT
Definition: ObjectGuid.h:49
@ UPDATEFLAG_LIVING
Definition: UpdateData.h:44
@ UPDATEFLAG_STATIONARY_POSITION
Definition: UpdateData.h:45
@ SERVERSIDE_VISIBILITY_GHOST
Definition: SharedDefines.h:1274
#define MAX_STATS
Definition: SharedDefines.h:265
constexpr auto MAX_SPELL_SCHOOL
Definition: SharedDefines.h:292
@ GHOST_VISIBILITY_ALIVE
Definition: SharedDefines.h:1281
#define MAX_SPELL_IMMUNITY
Definition: SharedDefines.h:1404
Definition: ThreatMgr.h:294
uint16 m_objectType
Definition: Object.h:238
uint16 m_updateFlag
Definition: Object.h:241
TypeID m_objectTypeId
Definition: Object.h:240
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition: Object.h:370
Definition: Object.h:403
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition: Object.h:521
void Relocate(float x, float y)
Definition: Position.h:73
uint32 m_reactiveTimer[MAX_REACTIVE]
Definition: Unit.h:1869
uint32 m_lastSanctuaryTime
Definition: Unit.h:1479
LiquidTypeEntry const * _lastLiquid
Definition: Unit.h:1880
uint32 m_transform
Definition: Unit.h:1841
uint32 m_CombatTimer
Definition: Unit.h:1917
bool m_canModifyStats
Definition: Unit.h:1859
bool NeedChangeAI
Definition: Unit.h:1692
uint32 m_state
Definition: Unit.h:1916
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition: Unit.h:1857
int32 m_attackTimer[MAX_ATTACK]
Definition: Unit.h:1825
float m_modAttackSpeedPct[3]
Definition: Unit.h:1433
uint8 m_realRace
Definition: Unit.h:1820
Vehicle * m_vehicle
Definition: Unit.h:1876
uint32 m_rootTimes
Definition: Unit.h:1913
uint8 m_race
Definition: Unit.h:1821
UnitAI * i_AI
Definition: Unit.h:1813
uint32 _lastExtraAttackSpell
Definition: Unit.h:1941
bool _instantCast
Definition: Unit.h:1886
ObjectGuid m_ObjectSlot[MAX_GAMEOBJECT_SLOT]
Definition: Unit.h:1411
RedirectThreatInfo _redirectThreatInfo
Definition: Unit.h:1931
float m_createStats[MAX_STATS]
Definition: Unit.h:1827
float m_modRangedHitChance
Definition: Unit.h:1428
DeathState m_deathState
Definition: Unit.h:1832
uint32 m_unitTypeMask
Definition: Unit.h:1879
uint32 m_removedAurasCount
Definition: Unit.h:1849
ThreatMgr m_ThreatMgr
Definition: Unit.h:1872
Unit * m_comboTarget
Definition: Unit.h:1927
AuraMap::iterator m_auraUpdateIterator
Definition: Unit.h:1848
bool m_AutoRepeatFirstCast
Definition: Unit.h:1823
uint16 m_delayed_unit_ai_notify_timer
Definition: Unit.h:1754
int32 m_regenTimer
Definition: Unit.h:1870
bool bRequestForcedVisibilityUpdate
Definition: Unit.h:1755
bool m_ControlledByPlayer
Definition: Unit.h:1704
uint32 m_last_notify_mstime
Definition: Unit.h:1752
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
Definition: Unit.h:1478
int8 m_comboPoints
Definition: Unit.h:1928
uint32 _oldFactionId
faction before charm
Definition: Unit.h:1936
int32 m_baseSpellCritChance
Definition: Unit.h:1430
float m_modMeleeHitChance
Definition: Unit.h:1427
float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
Definition: Unit.h:1858
Position m_last_notify_position
Definition: Unit.h:1751
Vehicle * m_vehicleKit
Definition: Unit.h:1877
bool IsAIEnabled
Definition: Unit.h:1692
HostileRefMgr m_HostileRefMgr
Definition: Unit.h:1923
bool m_applyResilience
Definition: Unit.h:1883
bool m_canDualWield
Definition: Unit.h:696
uint32 m_interruptMask
Definition: Unit.h:1855
int32 m_procDeep
Definition: Unit.h:1834
float m_speed_rate[MAX_MOVE_TYPE]
Definition: Unit.h:1862
float m_modSpellHitChance
Definition: Unit.h:1429
UnitAI * i_disabledAI
Definition: Unit.h:1813
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
Definition: Unit.h:1410
bool m_cleanupDone
Definition: Unit.h:1933
bool _isWalkingBeforeCharm
Are we walking before we were charmed?
Definition: Unit.h:1937
bool m_CreatedByPlayer
Definition: Unit.h:1705
uint16 m_delayed_unit_relocation_timer
Definition: Unit.h:1753
float m_threatModifier[MAX_SPELL_SCHOOL]
Definition: Unit.h:1432
uint32 m_lastManaUse
Definition: Unit.h:1918
Definition: MotionMaster.h:110
Definition: MoveSpline.h:40

References _instantCast, _isWalkingBeforeCharm, _lastExtraAttackSpell, _lastLiquid, _oldFactionId, _redirectThreatInfo, BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, bRequestForcedVisibilityUpdate, CURRENT_MAX_SPELL, GHOST_VISIBILITY_ALIVE, m_applyResilience, m_attacking, m_attackTimer, m_auraModifiersGroup, m_auraUpdateIterator, m_baseSpellCritChance, m_canDualWield, m_canModifyStats, m_charmInfo, m_cleanupDone, m_CombatTimer, m_createStats, m_currentSpells, m_deathState, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_duringRemoveFromWorld, m_interruptMask, m_last_notify_mstime, m_last_notify_position, m_lastManaUse, m_modAttackSpeedPct, m_modMeleeHitChance, m_modRangedHitChance, m_modSpellHitChance, m_ObjectSlot, Object::m_objectType, Object::m_objectTypeId, m_ownedAuras, m_reactiveTimer, m_rootTimes, WorldObject::m_serverSideVisibility, m_speed_rate, m_spellImmune, m_state, m_SummonSlot, m_threatModifier, m_transform, Object::m_updateFlag, m_weaponDamage, MAX_ATTACK, MAX_GAMEOBJECT_SLOT, MAX_MOVE_TYPE, MAX_REACTIVE, MAX_SPELL_IMMUNITY, MAX_SPELL_SCHOOL, MAX_STATS, MAX_SUMMON_SLOT, MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, Position::Relocate(), SERVERSIDE_VISIBILITY_GHOST, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), TOTAL_PCT, TOTAL_VALUE, TYPEID_UNIT, TYPEMASK_UNIT, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_END, UPDATEFLAG_LIVING, and UPDATEFLAG_STATIONARY_POSITION.

Member Function Documentation

◆ _addAttacker()

void Unit::_addAttacker ( Unit pAttacker)
inline
699 {
700 m_attackers.insert(pAttacker);
701 }

References m_attackers.

Referenced by Attack().

◆ _AddAura()

void Unit::_AddAura ( UnitAura aura,
Unit caster 
)
4373{
4375 m_ownedAuras.insert(AuraMap::value_type(aura->GetId(), aura));
4376
4378
4379 if (aura->IsRemoved())
4380 return;
4381
4383 if (aura->IsSingleTarget())
4384 {
4385 ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()));
4386 /* @HACK: Player is not in world during loading auras.
4387 * Single target auras are not saved or loaded from database
4388 * but may be created as a result of aura links (player mounts with passengers)
4389 */
4390
4391 // register single target aura
4392 caster->GetSingleCastAuras().push_back(aura);
4393 // remove other single target auras
4394 Unit::AuraList& scAuras = caster->GetSingleCastAuras();
4395 for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();)
4396 {
4397 if ((*itr) != aura &&
4398 (*itr)->IsSingleTargetWith(aura))
4399 {
4400 (*itr)->Remove();
4401 itr = scAuras.begin();
4402 }
4403 else
4404 ++itr;
4405 }
4406 }
4407}
@ SPELL_AURA_CONTROL_VEHICLE
Definition: SpellAuraDefines.h:299
bool IsInWorld() const
Definition: Object.h:104
ObjectGuid GetGUID() const
Definition: Object.h:110
void _RemoveNoStackAurasDueToAura(Aura *aura)
Definition: Unit.cpp:4622
std::list< Aura * > AuraList
Definition: Unit.h:647
bool IsDuringRemoveFromWorld() const
Definition: Unit.h:1738
AuraList & GetSingleCastAuras()
Definition: Unit.h:1310
ObjectGuid GetCasterGUID() const
Definition: SpellAuras.h:105
bool IsRemoved() const
Definition: SpellAuras.h:161
uint32 GetId() const
Definition: SpellAuras.cpp:466
bool HasEffectType(AuraType type) const
Definition: SpellAuras.cpp:1222
SpellInfo const * GetSpellInfo() const
Definition: SpellAuras.h:100
void SetIsSingleTarget(bool val)
Definition: SpellAuras.h:166
bool IsSingleTarget() const
Definition: SpellAuras.h:164
bool IsSingleTarget() const
Definition: SpellInfo.cpp:1373

References _RemoveNoStackAurasDueToAura(), ASSERT, Aura::GetCasterGUID(), Object::GetGUID(), Aura::GetId(), GetSingleCastAuras(), Aura::GetSpellInfo(), Aura::HasEffectType(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Aura::IsRemoved(), Aura::IsSingleTarget(), SpellInfo::IsSingleTarget(), Aura::IsSingleTargetWith(), m_cleanupDone, m_ownedAuras, Aura::SetIsSingleTarget(), and SPELL_AURA_CONTROL_VEHICLE.

Referenced by UnitAura::UnitAura().

◆ _ApplyAllAuraStatMods()

void Unit::_ApplyAllAuraStatMods ( )
5433{
5434 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5435 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, true);
5436}
@ AURA_EFFECT_HANDLE_STAT
Definition: SpellAuraDefines.h:46

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_ApplyAllStatBonuses().

◆ _ApplyAura()

void Unit::_ApplyAura ( AuraApplication aurApp,
uint8  effMask 
)
4464{
4465 Aura* aura = aurApp->GetBase();
4466
4468
4469 if (aurApp->GetRemoveMode())
4470 return;
4471
4472 Unit* caster = aura->GetCaster();
4473
4474 // Update target aura state flag
4475 SpellInfo const* spellInfo = aura->GetSpellInfo();
4476 if (AuraStateType aState = spellInfo->GetAuraState())
4477 {
4478 uint32 aStateMask = (1 << (aState - 1));
4479 // force update so the new caster registers it
4480 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) && HasFlag(UNIT_FIELD_AURASTATE, aStateMask))
4482 else
4483 ModifyAuraState(aState, true);
4484 }
4485
4486 if (aurApp->GetRemoveMode())
4487 return;
4488
4489 // Sitdown on apply aura req seated
4492
4493 if (aurApp->GetRemoveMode())
4494 return;
4495
4496 aura->HandleAuraSpecificMods(aurApp, caster, true, false);
4497
4498 // apply effects of the aura
4499 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4500 {
4501 if (effMask & 1 << i && (!aurApp->GetRemoveMode()))
4502 aurApp->_HandleEffect(i, true);
4503 }
4504
4505 sScriptMgr->OnAuraApply(this, aura);
4506}
std::uint32_t uint32
Definition: Define.h:107
@ UNIT_STAND_STATE_SIT
Definition: UnitDefines.h:33
@ UNIT_FIELD_AURASTATE
Definition: UpdateFields.h:119
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition: SpellDefines.h:62
#define sScriptMgr
Definition: ScriptMgr.h:706
#define MAX_SPELL_EFFECTS
Definition: DBCStructure.h:1637
#define PER_CASTER_AURA_STATE_MASK
Definition: SharedDefines.h:1318
AuraStateType
Definition: SharedDefines.h:1288
bool HasFlag(uint16 index, uint32 flag) const
Definition: Object.cpp:889
void ForceValuesUpdateAtIndex(uint32)
Definition: Object.cpp:2067
Definition: Unit.h:630
void ModifyAuraState(AuraStateType flag, bool apply)
Definition: Unit.cpp:10423
void SetStandState(uint8 state)
Definition: Unit.cpp:16640
bool IsSitState() const
Definition: Unit.cpp:16625
void _HandleEffect(uint8 effIndex, bool apply)
Definition: SpellAuras.cpp:161
Aura * GetBase() const
Definition: SpellAuras.h:62
AuraRemoveMode GetRemoveMode() const
Definition: SpellAuras.h:73
Definition: SpellAuras.h:87
Unit * GetCaster() const
Definition: SpellAuras.cpp:471
void HandleAuraSpecificMods(AuraApplication const *aurApp, Unit *caster, bool apply, bool onReapply)
Definition: SpellAuras.cpp:1265
Definition: SpellInfo.h:316
AuraStateType GetAuraState() const
Definition: SpellInfo.cpp:2059
uint32 AuraInterruptFlags
Definition: SpellInfo.h:353

References AuraApplication::_HandleEffect(), _RemoveNoStackAurasDueToAura(), AURA_INTERRUPT_FLAG_NOT_SEATED, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), Aura::HandleAuraSpecificMods(), Object::HasFlag(), IsSitState(), MAX_SPELL_EFFECTS, ModifyAuraState(), PER_CASTER_AURA_STATE_MASK, SetStandState(), sScriptMgr, UNIT_FIELD_AURASTATE, and UNIT_STAND_STATE_SIT.

Referenced by _ApplyAuraEffect().

◆ _ApplyAuraEffect()

void Unit::_ApplyAuraEffect ( Aura aura,
uint8  effIndex 
)
4450{
4451 ASSERT(aura);
4452 ASSERT(aura->HasEffect(effIndex));
4454 ASSERT(aurApp);
4455 if (!aurApp->GetEffectMask())
4456 _ApplyAura(aurApp, 1 << effIndex);
4457 else
4458 aurApp->_HandleEffect(effIndex, true);
4459}
void _ApplyAura(AuraApplication *aurApp, uint8 effMask)
Definition: Unit.cpp:4463
Definition: SpellAuras.h:37
uint8 GetEffectMask() const
Definition: SpellAuras.h:66
bool HasEffect(uint8 effIndex) const
Definition: SpellAuras.h:173
const AuraApplication * GetApplicationOfTarget(ObjectGuid guid) const
Definition: SpellAuras.h:183

References _ApplyAura(), AuraApplication::_HandleEffect(), ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetEffectMask(), Object::GetGUID(), and Aura::HasEffect().

◆ _CreateAuraApplication()

AuraApplication * Unit::_CreateAuraApplication ( Aura aura,
uint8  effMask 
)
4412{
4413 // can't apply aura on unit which is going to be deleted - to not create a memory leak
4415 // aura musn't be removed
4416 ASSERT(!aura->IsRemoved());
4417
4418 // aura mustn't be already applied on target
4419 ASSERT (!aura->IsAppliedOnTarget(GetGUID()) && "Unit::_CreateAuraApplication: aura musn't be applied on target");
4420
4421 SpellInfo const* aurSpellInfo = aura->GetSpellInfo();
4422 uint32 aurId = aurSpellInfo->Id;
4423
4424 // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
4425 // Xinef: Added IsAllowingDeadTarget check
4426 if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (GetTypeId() != TYPEID_PLAYER || !ToPlayer()->GetSession()->PlayerLoading()))
4427 return nullptr;
4428
4429 Unit* caster = aura->GetCaster();
4430
4431 AuraApplication* aurApp = new AuraApplication(this, caster, aura, effMask);
4432 m_appliedAuras.insert(AuraApplicationMap::value_type(aurId, aurApp));
4433
4434 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4435 // xinef: even if it gets removed, it will be reapplied in a second
4436 if (aurSpellInfo->AuraInterruptFlags && this == aura->GetOwner())
4437 {
4438 m_interruptableAuras.push_back(aurApp);
4439 AddInterruptMask(aurSpellInfo->AuraInterruptFlags);
4440 }
4441
4442 if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState())
4443 m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp));
4444
4445 aura->_ApplyForTarget(this, caster, aurApp);
4446 return aurApp;
4447}
@ TYPEID_PLAYER
Definition: ObjectGuid.h:36
Player * ToPlayer()
Definition: Object.h:198
TypeID GetTypeId() const
Definition: Object.h:124
void AddInterruptMask(uint32 mask)
Definition: Unit.h:1505
bool IsAlive() const
Definition: Unit.h:1150
AuraApplicationList m_interruptableAuras
Definition: Unit.h:1853
AuraStateAurasMap m_auraStateAuras
Definition: Unit.h:1854
WorldObject * GetOwner() const
Definition: SpellAuras.h:107
bool IsAppliedOnTarget(ObjectGuid guid) const
Definition: SpellAuras.h:185
virtual void _ApplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition: SpellAuras.cpp:492
bool IsDeathPersistent() const
Definition: SpellInfo.cpp:1216
uint32 Id
Definition: SpellInfo.h:320
bool IsAllowingDeadTarget() const
Definition: SpellInfo.cpp:1226

References Aura::_ApplyForTarget(), AddInterruptMask(), ASSERT, SpellInfo::AuraInterruptFlags, SpellInfo::GetAuraState(), Aura::GetCaster(), Object::GetGUID(), Aura::GetOwner(), Aura::GetSpellInfo(), Object::GetTypeId(), SpellInfo::Id, IsAlive(), SpellInfo::IsAllowingDeadTarget(), Aura::IsAppliedOnTarget(), SpellInfo::IsDeathPersistent(), Aura::IsRemoved(), m_appliedAuras, m_auraStateAuras, m_cleanupDone, m_interruptableAuras, Object::ToPlayer(), and TYPEID_PLAYER.

◆ _DeleteRemovedAuras()

void Unit::_DeleteRemovedAuras ( )
protected
3796{
3797 while (!m_removedAuras.empty())
3798 {
3799 delete m_removedAuras.front();
3800 m_removedAuras.pop_front();
3801 }
3802}

References m_removedAuras.

Referenced by _UpdateSpells(), and ~Unit().

◆ _EnterVehicle()

void Unit::_EnterVehicle ( Vehicle vehicle,
int8  seatId,
AuraApplication const *  aurApp = nullptr 
)
19548{
19549 // Must be called only from aura handler
19550 if (!IsAlive() || GetVehicleKit() == vehicle || vehicle->GetBase()->IsOnVehicle(this))
19551 return;
19552
19553 if (m_vehicle)
19554 {
19555 if (m_vehicle == vehicle)
19556 {
19557 if (seatId >= 0 && seatId != GetTransSeat())
19558 {
19559 LOG_DEBUG("vehicles", "EnterVehicle: {} leave vehicle {} seat {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId);
19560 ChangeSeat(seatId);
19561 }
19562
19563 return;
19564 }
19565 else
19566 {
19567 LOG_DEBUG("vehicles", "EnterVehicle: {} exit {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), vehicle->GetBase()->GetEntry());
19568 ExitVehicle();
19569 }
19570 }
19571
19572 if (!aurApp || aurApp->GetRemoveMode())
19573 return;
19574
19575 if (Player* player = ToPlayer())
19576 {
19577 if (vehicle->GetBase()->IsPlayer() && player->IsInCombat())
19578 return;
19579
19580 sScriptMgr->AnticheatSetUnderACKmount(player);
19581
19583 player->StopCastingCharm();
19584 player->StopCastingBindSight();
19585 Dismount();
19587
19588 // drop flag at invisible in bg
19589 if (Battleground* bg = player->GetBattleground())
19590 bg->EventPlayerDroppedFlag(player);
19591
19593 player->GetSession()->SendPacket(&data);
19594 }
19595
19596 ASSERT(!m_vehicle);
19597 m_vehicle = vehicle;
19598
19599 if (!m_vehicle->AddPassenger(this, seatId))
19600 {
19601 m_vehicle = nullptr;
19602 return;
19603 }
19604
19605 // Xinef: remove movement auras when entering vehicle (food buffs etc)
19607}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:168
@ SPELL_AURA_MOUNTED
Definition: SpellAuraDefines.h:141
@ AURA_INTERRUPT_FLAG_MOVE
Definition: SpellDefines.h:47
@ AURA_INTERRUPT_FLAG_TURNING
Definition: SpellDefines.h:48
@ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA
Definition: Opcodes.h:1211
Definition: Battleground.h:298
bool IsPlayer() const
Definition: Object.h:197
uint32 GetEntry() const
Definition: Object.h:112
int8 GetTransSeat() const
Definition: Object.h:603
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4087
void Dismount()
Definition: Unit.cpp:13445
bool IsOnVehicle(Unit const *vehicle) const
Definition: Unit.h:1697
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition: Unit.cpp:5054
void ChangeSeat(int8 seatId, bool next=true)
Definition: Unit.cpp:19609
Vehicle * GetVehicleKit() const
Definition: Unit.h:1695
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition: Unit.cpp:5125
void ExitVehicle(Position const *exitPosition=nullptr)
Definition: Unit.cpp:19628
Unit * GetBase() const
May be called from scripts.
Definition: Vehicle.h:37
bool AddPassenger(Unit *passenger, int8 seatId=-1)
Definition: Vehicle.cpp:305
Definition: WorldPacket.h:27

References Vehicle::AddPassenger(), ASSERT, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, ChangeSeat(), Dismount(), ExitVehicle(), Vehicle::GetBase(), Object::GetEntry(), AuraApplication::GetRemoveMode(), WorldObject::GetTransSeat(), GetVehicleKit(), InterruptNonMeleeSpells(), IsAlive(), IsOnVehicle(), Object::IsPlayer(), LOG_DEBUG, m_vehicle, RemoveAurasByType(), RemoveAurasWithInterruptFlags(), SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SPELL_AURA_MOUNTED, sScriptMgr, and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraControlVehicle().

◆ _ExitVehicle()

void Unit::_ExitVehicle ( Position const *  exitPosition = nullptr)
19666{
19667 if (!m_vehicle)
19668 return;
19669
19671
19672 Player* player = ToPlayer();
19673
19674 // If player is on mouted duel and exits the mount should immediatly lose the duel
19675 if (player && player->duel && player->duel->IsMounted)
19676 player->DuelComplete(DUEL_FLED);
19677
19678 // This should be done before dismiss, because there may be some aura removal
19679 Vehicle* vehicle = m_vehicle;
19680 Unit* vehicleBase = m_vehicle->GetBase();
19681 m_vehicle = nullptr;
19682
19683 if (!vehicleBase)
19684 return;
19685
19686 SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT
19687
19688 Position pos;
19689 if (!exitPosition) // Exit position not specified
19690 pos = vehicleBase->GetPosition(); // This should use passenger's current position, leaving it as it is now
19691 // because we calculate positions incorrect (sometimes under map)
19692 else
19693 pos = *exitPosition;
19694
19695 // HACK
19696 VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
19697 if (vehicleInfo)
19698 {
19699 if (vehicleInfo->m_ID == 380) // Kologarn right arm
19700 {
19701 pos.Relocate(1776.0f, -24.0f, 448.75f, 0.0f);
19702 }
19703 else if (vehicleInfo->m_ID == 91) // Helsman's Ship
19704 {
19705 pos.Relocate(2802.18f, 7054.91f, -0.6f, 4.67f);
19706 }
19707 else if (vehicleInfo->m_ID == 349) // AT Mounts, dismount to the right
19708 {
19709 float x = pos.GetPositionX() + 2.0f * cos(pos.GetOrientation() - M_PI / 2.0f);
19710 float y = pos.GetPositionY() + 2.0f * std::sin(pos.GetOrientation() - M_PI / 2.0f);
19711 float z = GetMapHeight(x, y, pos.GetPositionZ());
19712 if (z > INVALID_HEIGHT)
19713 {
19714 pos.Relocate(x, y, z);
19715 }
19716 }
19717 }
19718
19720
19721 if (player)
19722 {
19724
19725 sScriptMgr->AnticheatSetUnderACKmount(player);
19726 }
19728 {
19730 data << GetPackGUID();
19731 SendMessageToSet(&data, false);
19732 }
19733
19734 // xinef: hack for flameleviathan seat vehicle
19735 if (!vehicleInfo || vehicleInfo->m_ID != 341)
19736 {
19737 Movement::MoveSplineInit init(this);
19738 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
19739 init.SetFacing(GetOrientation());
19740 init.SetTransportExit();
19741 init.Launch();
19742 }
19743 else
19744 {
19745 float o = pos.GetAngle(this);
19746 Movement::MoveSplineInit init(this);
19747 init.MoveTo(pos.GetPositionX() + 8 * cos(o), pos.GetPositionY() + 8 * std::sin(o), pos.GetPositionZ() + 16.0f);
19748 init.SetFacing(GetOrientation());
19749 init.SetTransportExit();
19750 init.Launch();
19751 DisableSpline();
19752 KnockbackFrom(pos.GetPositionX(), pos.GetPositionY(), 10.0f, 20.0f);
19754 }
19755
19756 // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
19757 if (GetTypeId() == TYPEID_UNIT && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
19758 {
19760 }
19761
19762 if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
19763 if (((Minion*)vehicleBase)->GetOwner() == this)
19764 {
19765 if (!vehicleInfo || vehicleInfo->m_ID != 349)
19766 {
19767 vehicle->Dismiss();
19768 }
19769 else if (vehicleBase->GetTypeId() == TYPEID_UNIT)
19770 {
19771 vehicle->Uninstall();
19772 vehicleBase->m_Events.AddEvent(new VehicleDespawnEvent(*vehicleBase, 2000), vehicleBase->m_Events.CalculateTime(2000));
19773 }
19774
19775 // xinef: ugly hack, no appripriate hook later to cast spell
19776 if (player)
19777 {
19778 if (vehicleBase->GetEntry() == NPC_EIDOLON_WATCHER)
19779 player->CastSpell(player, VEHICLE_SPELL_SHADE_CONTROL_END, true);
19780 else if (vehicleBase->GetEntry() == NPC_LITHE_STALKER)
19781 player->CastSpell(player, VEHICLE_SPELL_GEIST_CONTROL_END, true);
19782 }
19783 }
19784
19786 {
19787 // Vehicle just died, we die too
19788 if (vehicleBase->getDeathState() == DeathState::JustDied)
19789 setDeathState(DeathState::JustDied);
19790 // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
19791 else
19792 {
19793 SetVisible(false);
19794 ToTempSummon()->UnSummon(2000); // Approximation
19795 }
19796 }
19797
19798 if (player)
19799 {
19801 player->SetCanTeleport(true);
19802 }
19803}
@ VEHICLE_SPELL_PARACHUTE
Definition: VehicleDefines.h:53
@ VEHICLE_SPELL_SHADE_CONTROL_END
Definition: VehicleDefines.h:56
@ VEHICLE_SPELL_GEIST_CONTROL_END
Definition: VehicleDefines.h:55
@ NPC_EIDOLON_WATCHER
Definition: VehicleDefines.h:61
@ NPC_LITHE_STALKER
Definition: VehicleDefines.h:62
@ MOVEMENTFLAG_ROOT
Definition: UnitDefines.h:355
@ UNIT_MASK_ACCESSORY
Definition: UnitDefines.h:144
@ UNIT_MASK_MINION
Definition: UnitDefines.h:136
@ UNIT_STATE_ROOT
Definition: UnitDefines.h:159
@ UNIT_STATE_MOVE
Definition: UnitDefines.h:168
@ DELAYED_VEHICLE_TELEPORT
Definition: Player.h:908
#define INVALID_HEIGHT
Definition: Map.h:165
@ DUEL_FLED
Definition: SharedDefines.h:3614
@ SMSG_SPLINE_MOVE_UNROOT
Definition: Opcodes.h:802
Seconds GetGameTime()
Definition: GameTime.cpp:38
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true)
Definition: EventProcessor.h:103
uint64 CalculateTime(uint64 t_offset) const
Definition: EventProcessor.cpp:159
virtual void UnSummon(uint32 msTime=0)
Definition: TemporarySummon.cpp:282
Definition: TemporarySummon.h:76
PackedGuid const & GetPackGUID() const
Definition: Object.h:111
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition: Object.cpp:2080
float GetMapHeight(float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
Definition: Object.cpp:3115
Definition: Position.h:28
float GetPositionZ() const
Definition: Position.h:119
float GetOrientation() const
Definition: Position.h:120
float GetPositionX() const
Definition: Position.h:117
void GetPosition(float &x, float &y) const
Definition: Position.h:122
float GetPositionY() const
Definition: Position.h:118
float GetAngle(const Position *pos) const
Definition: Position.cpp:77
void SetCanTeleport(bool value)
Definition: Player.h:2474
void DuelComplete(DuelCompleteType type)
Definition: Player.cpp:6366
void SetFallInformation(uint32 time, float z)
Definition: Player.h:2312
std::unique_ptr< DuelInfo > duel
Definition: Player.h:1854
void ResummonPetTemporaryUnSummonedIfAny()
Definition: Player.cpp:14179
uint32 GetDelayedOperations() const
Definition: Player.h:2074
void SetVisible(bool x)
Definition: Unit.cpp:14147
virtual void setDeathState(DeathState s, bool despawn=false)
Definition: Unit.cpp:14465
Unit * GetOwner() const
Definition: Unit.cpp:10526
DeathState getDeathState()
Definition: Unit.h:1153
virtual bool CanFly() const =0
MotionMaster * GetMotionMaster()
Definition: Unit.h:1604
TempSummon * ToTempSummon()
Definition: Unit.h:1742
void DisableSpline()
Definition: Unit.cpp:637
void AddUnitState(uint32 f)
Definition: Unit.h:737
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition: Unit.cpp:17937
EventProcessor m_Events
Definition: Unit.h:1436
bool HasUnitMovementFlag(uint32 f) const
Definition: Unit.h:1616
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1151
uint32 HasUnitTypeMask(uint32 mask) const
Definition: Unit.h:747
void KnockbackFrom(float x, float y, float speedXY, float speedZ)
Definition: Unit.cpp:19046
Definition: Vehicle.h:28
void Dismiss()
Definition: Vehicle.cpp:521
VehicleEntry const * GetVehicleInfo() const
Definition: Vehicle.h:38
void RemovePassenger(Unit *passenger)
Definition: Vehicle.cpp:442
void Uninstall()
Definition: Vehicle.cpp:97
Definition: Vehicle.h:100
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
Definition: MotionMaster.cpp:587
Definition: MoveSplineInit.h:71
Definition: DBCStructure.h:2027
uint32 m_ID
Definition: DBCStructure.h:2028

References EventProcessor::AddEvent(), AddUnitState(), EventProcessor::CalculateTime(), CanFly(), CastSpell(), DELAYED_VEHICLE_TELEPORT, DisableSpline(), Vehicle::Dismiss(), Player::duel, DUEL_FLED, Player::DuelComplete(), Position::GetAngle(), Vehicle::GetBase(), getDeathState(), Player::GetDelayedOperations(), Object::GetEntry(), GameTime::GetGameTime(), WorldObject::GetMapHeight(), GetMotionMaster(), Position::GetOrientation(), GetOwner(), Object::GetPackGUID(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::GetTypeId(), Vehicle::GetVehicleInfo(), HasUnitMovementFlag(), HasUnitTypeMask(), INVALID_HEIGHT, KnockbackFrom(), Movement::MoveSplineInit::Launch(), m_Events, VehicleEntry::m_ID, m_vehicle, MotionMaster::MoveFall(), MOVEMENTFLAG_ROOT, Movement::MoveSplineInit::MoveTo(), NPC_EIDOLON_WATCHER, NPC_LITHE_STALKER, Position::Relocate(), Vehicle::RemovePassenger(), Player::ResummonPetTemporaryUnSummonedIfAny(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SetControlled(), setDeathState(), Movement::MoveSplineInit::SetFacing(), Player::SetFallInformation(), Movement::MoveSplineInit::SetTransportExit(), SetVisible(), SMSG_SPLINE_MOVE_UNROOT, sScriptMgr, Object::ToPlayer(), ToTempSummon(), TYPEID_UNIT, Vehicle::Uninstall(), UNIT_MASK_ACCESSORY, UNIT_MASK_MINION, UNIT_STATE_MOVE, UNIT_STATE_ROOT, TempSummon::UnSummon(), VEHICLE_SPELL_GEIST_CONTROL_END, VEHICLE_SPELL_PARACHUTE, and VEHICLE_SPELL_SHADE_CONTROL_END.

Referenced by AuraEffect::HandleAuraControlVehicle(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ _IsNoStackAuraDueToAura()

bool Unit::_IsNoStackAuraDueToAura ( Aura appliedAura,
Aura existingAura 
) const

◆ _IsValidAssistTarget()

bool Unit::_IsValidAssistTarget ( Unit const *  target,
SpellInfo const *  bySpell 
) const
13916{
13917 ASSERT(target);
13918
13919 // can assist to self
13920 if (this == target)
13921 return true;
13922
13923 // can't assist unattackable units or GMs
13924 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13925 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
13926 return false;
13927
13928 // can't assist own vehicle or passenger
13929 if (m_vehicle)
13930 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
13931 return false;
13932
13933 // can't assist invisible
13934 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
13935 return false;
13936
13937 // can't assist dead
13938 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
13939 return false;
13940
13941 // can't assist untargetable
13942 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
13943 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
13944 return false;
13945
13946 if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
13947 {
13948 // xinef: do not allow to assist non attackable units
13949 if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
13950 return false;
13951
13953 {
13954 if (target->IsImmuneToPC())
13955 return false;
13956 }
13957 else
13958 {
13959 if (target->IsImmuneToNPC())
13960 return false;
13961 }
13962 }
13963
13964 // can't assist non-friendly targets
13965 if (GetReactionTo(target) < REP_NEUTRAL
13966 && target->GetReactionTo(this) < REP_NEUTRAL
13967 && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
13968 return false;
13969
13970 // PvP case
13971 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
13972 {
13973 Player const* targetPlayerOwner = target->GetAffectingPlayer();
13975 {
13976 Player const* selfPlayerOwner = GetAffectingPlayer();
13977 if (selfPlayerOwner && targetPlayerOwner)
13978 {
13979 // can't assist player which is dueling someone
13980 if (selfPlayerOwner != targetPlayerOwner
13981 && targetPlayerOwner->duel)
13982 return false;
13983 }
13984 // can't assist player in ffa_pvp zone from outside
13985 if (target->IsFFAPvP() && !IsFFAPvP())
13986 return false;
13987
13988 // can't assist player out of sanctuary from sanctuary if has pvp enabled
13989 if (target->IsPvP())
13990 if (IsInSanctuary() && !target->IsInSanctuary())
13991 return false;
13992 }
13993 }
13994 // PvC case - player can assist creature only if has specific type flags
13995 // !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) &&
13997 && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
13998 && !target->IsPvP())
13999 {
14000 if (Creature const* creatureTarget = target->ToCreature())
14001 return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
14002 }
14003 return true;
14004}
@ UNIT_STATE_UNATTACKABLE
Definition: UnitDefines.h:186
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:230
@ UNIT_FLAG_NOT_SELECTABLE
Definition: UnitDefines.h:254
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition: UnitDefines.h:232
@ REP_NEUTRAL
Definition: SharedDefines.h:183
@ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT
Definition: SharedDefines.h:2721
@ CREATURE_TYPE_FLAG_CAN_ASSIST
Definition: SharedDefines.h:2707
@ SPELL_ATTR6_CAN_TARGET_UNTARGETABLE
Definition: SharedDefines.h:628
@ SPELL_ATTR6_IGNORE_PHASE_SHIFT
Definition: SharedDefines.h:617
@ SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC
Definition: SharedDefines.h:607
Definition: Creature.h:46
Creature * ToCreature()
Definition: Object.h:201
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition: Object.cpp:1726
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition: Unit.cpp:9999
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:824
bool IsInSanctuary() const
Definition: Unit.h:860
bool IsFFAPvP() const
Definition: Unit.h:862
Player * GetAffectingPlayer() const
Definition: Unit.cpp:10551

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_CAN_ASSIST, CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, GetAffectingPlayer(), Vehicle::GetBase(), GetReactionTo(), SpellInfo::HasAttribute(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsImmuneToNPC(), IsImmuneToPC(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), m_vehicle, REP_NEUTRAL, SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_STATE_UNATTACKABLE.

Referenced by SpellInfo::CheckExplicitTarget(), IsValidAssistTarget(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _IsValidAttackTarget()

bool Unit::_IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell,
WorldObject const *  obj = nullptr 
) const
13793{
13794 ASSERT(target);
13795
13796 // can't attack self
13797 if (this == target)
13798 return false;
13799
13800 // can't attack unattackable units or GMs
13801 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13802 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
13803 return false;
13804
13805 // can't attack own vehicle or passenger
13806 if (m_vehicle)
13807 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
13808 if (!IsHostileTo(target)) // pussywizard: actually can attack own vehicle or passenger if it's hostile to us - needed for snobold in Gormok encounter
13809 return false;
13810
13811 // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
13812 //Ignore stealth if target is player and unit in combat with same player
13813 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea()) || (target->IsPlayer() && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target)))))
13814 return false;
13815
13816 // can't attack dead
13817 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
13818 return false;
13819
13820 // can't attack untargetable
13821 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
13822 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
13823 return false;
13824
13825 if (Player const* playerAttacker = ToPlayer())
13826 {
13827 if (playerAttacker->HasPlayerFlag(PLAYER_FLAGS_UBER) || playerAttacker->IsSpectator())
13828 return false;
13829 }
13830 // check flags
13832 || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())
13833 || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())
13834 || (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToPC())
13835 // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly
13836 || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))
13837 return false;
13838
13839 // CvC case - can attack each other only when one of them is hostile
13841 return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;
13842
13843 // PvP, PvC, CvP case
13844 // can't attack friendly targets
13845 ReputationRank repThisToTarget = GetReactionTo(target);
13846 ReputationRank repTargetToThis;
13847
13848 if (repThisToTarget > REP_NEUTRAL
13849 || (repTargetToThis = target->GetReactionTo(this)) > REP_NEUTRAL)
13850 return false;
13851
13852 // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)
13853 if (repThisToTarget == REP_NEUTRAL &&
13854 repTargetToThis <= REP_NEUTRAL)
13855 {
13856 Player* owner = GetAffectingPlayer();
13857 Unit const* const thisUnit = owner ? owner : this;
13858 if (!(target->IsPlayer() && thisUnit->IsPlayer()) &&
13859 !(target->GetTypeId() == TYPEID_UNIT && thisUnit->GetTypeId() == TYPEID_UNIT))
13860 {
13861 Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer();
13862 Unit const* creature = target->GetTypeId() == TYPEID_UNIT ? target : thisUnit;
13863
13864 if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry())
13865 {
13866 if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate)))
13867 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction))
13868 if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry))
13869 if (!(repState->Flags & FACTION_FLAG_AT_WAR))
13870 return false;
13871 }
13872 }
13873 }
13874
13875 Creature const* creatureAttacker = ToCreature();
13876 if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
13877 return false;
13878
13879 Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;
13880 Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;
13881
13882 // check duel - before sanctuary checks
13883 if (playerAffectingAttacker && playerAffectingTarget)
13884 if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)
13885 return true;
13886
13887 // PvP case - can't attack when attacker or target are in sanctuary
13888 // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp
13889 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))
13890 return false;
13891
13892 // additional checks - only PvP case
13893 if (playerAffectingAttacker && playerAffectingTarget)
13894 {
13895 if (!IsPvP() && bySpell && bySpell->IsAffectingArea() && !bySpell->HasAttribute(SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK))
13896 return false;
13897
13898 if (target->IsPvP())
13899 return true;
13900
13901 if (IsFFAPvP() && target->IsFFAPvP())
13902 return true;
13903
13905 }
13906 return true;
13907}
@ UNIT_BYTE2_FLAG_UNK1
Definition: UnitDefines.h:116
@ UNIT_FLAG_TAXI_FLIGHT
Definition: UnitDefines.h:249
@ UNIT_FLAG_NON_ATTACKABLE_2
Definition: UnitDefines.h:245
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition: UnitDefines.h:236
#define WORLD_TRIGGER
Definition: Unit.h:37
@ DUEL_STATE_IN_PROGRESS
Definition: Player.h:372
@ PLAYER_FLAGS_UBER
Definition: Player.h:493
@ TYPEMASK_DYNAMICOBJECT
Definition: ObjectGuid.h:52
@ TYPEMASK_GAMEOBJECT
Definition: ObjectGuid.h:51
@ UNIT_FIELD_BYTES_2
Definition: UpdateFields.h:161
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ FACTION_FLAG_AT_WAR
Definition: DBCEnums.h:308
@ SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK
Definition: SharedDefines.h:573
ReputationRank
Definition: SharedDefines.h:179
@ REP_HOSTILE
Definition: SharedDefines.h:181
CreatureTemplate const * GetCreatureTemplate() const
Definition: Creature.h:200
uint32 type_flags
Definition: CreatureData.h:226
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition: Object.cpp:949
ReputationMgr & GetReputationMgr()
Definition: Player.h:2101
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition: Unit.cpp:9969
bool IsPvP() const
Definition: Unit.h:861
bool IsInCombatWith(Unit const *who) const
Definition: Unit.cpp:20917
bool IsImmuneToNPC() const
Definition: Unit.h:1026
bool IsHostileTo(Unit const *unit) const
Definition: Unit.cpp:10171
bool IsImmuneToPC() const
Definition: Unit.h:1024
Definition: ReputationMgr.h:42
FactionState const * GetState(FactionEntry const *factionEntry) const
Definition: ReputationMgr.h:82
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
Definition: ReputationMgr.h:107
Definition: DBCStructure.h:907
Definition: DBCStructure.h:939

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_FLAG_AT_WAR, GetAffectingPlayer(), Vehicle::GetBase(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetReactionTo(), Player::GetReputationMgr(), ReputationMgr::GetState(), Object::GetTypeId(), SpellInfo::HasAttribute(), Object::HasByteFlag(), HasStealthAura(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsHostileTo(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsInCombatWith(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), Object::isType(), m_vehicle, PLAYER_FLAGS_UBER, REP_HOSTILE, REP_NEUTRAL, sFactionStore, SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEID_UNIT, TYPEMASK_DYNAMICOBJECT, TYPEMASK_GAMEOBJECT, UNIT_BYTE2_FLAG_UNK1, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NON_ATTACKABLE_2, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_UNATTACKABLE, and WORLD_TRIGGER.

Referenced by SpellInfo::CheckExplicitTarget(), Spell::DoSpellHitOnUnit(), GetMagicHitRedirectTarget(), GetMeleeHitRedirectTarget(), IsValidAttackTarget(), Acore::AnyAoETargetUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _RegisterAuraEffect()

void Unit::_RegisterAuraEffect ( AuraEffect aurEff,
bool  apply 
)
4652{
4653 if (apply)
4654 m_modAuras[aurEff->GetAuraType()].push_back(aurEff);
4655 else
4656 m_modAuras[aurEff->GetAuraType()].remove(aurEff);
4657}
AuraEffectList m_modAuras[TOTAL_AURAS]
Definition: Unit.h:1851
AuraType GetAuraType() const
Definition: SpellAuraEffects.cpp:447

References AuraEffect::GetAuraType(), and m_modAuras.

Referenced by AuraEffect::HandleEffect().

◆ _RegisterDynObject()

void Unit::_RegisterDynObject ( DynamicObject dynObj)
6063{
6064 m_dynObj.push_back(dynObj);
6065}

References m_dynObj.

Referenced by DynamicObject::BindToCaster().

◆ _RemoveAllAuraStatMods()

void Unit::_RemoveAllAuraStatMods ( )
5427{
5428 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5429 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, false);
5430}

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_RemoveAllStatBonuses().

◆ _removeAttacker()

void Unit::_removeAttacker ( Unit pAttacker)
inline
703 {
704 m_attackers.erase(pAttacker);
705 }

References m_attackers.

Referenced by Attack(), and AttackStop().

◆ _RemoveNoStackAuraApplicationsDueToAura()

void Unit::_RemoveNoStackAuraApplicationsDueToAura ( Aura aura)

◆ _RemoveNoStackAurasDueToAura()

void Unit::_RemoveNoStackAurasDueToAura ( Aura aura)
4623{
4624 //SpellInfo const* spellProto = aura->GetSpellInfo();
4625
4626 // passive spell special case (only non stackable with ranks)
4627
4628 // xinef: this check makes caster to have 2 area auras thanks to spec switch
4629 // if (spellProto->IsPassiveStackableWithRanks())
4630 // return;
4631
4632 bool remove = false;
4633 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
4634 {
4635 if (remove)
4636 {
4637 remove = false;
4638 i = m_appliedAuras.begin();
4639 }
4640
4641 if (aura->CanStackWith(i->second->GetBase(), true))
4642 continue;
4643
4645 if (i == m_appliedAuras.end())
4646 break;
4647 remove = true;
4648 }
4649}
@ AURA_REMOVE_BY_DEFAULT
Definition: SpellAuraDefines.h:392
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4731
bool CanStackWith(Aura const *checkAura, bool remove) const
Definition: SpellAuras.cpp:2021

References AURA_REMOVE_BY_DEFAULT, Aura::CanStackWith(), m_appliedAuras, and RemoveAura().

Referenced by _AddAura(), and _ApplyAura().

◆ _TryStackingOrRefreshingExistingAura()

Aura * Unit::_TryStackingOrRefreshingExistingAura ( SpellInfo const *  newAura,
uint8  effMask,
Unit caster,
int32 baseAmount = nullptr,
Item castItem = nullptr,
ObjectGuid  casterGUID = ObjectGuid::Empty,
bool  periodicReset = false 
)
4313{
4314 ASSERT(casterGUID || caster);
4315 if (!casterGUID)
4316 casterGUID = caster->GetGUID();
4317
4318 // Xinef: Hax for mixology, best solution qq
4319 if (sSpellMgr->GetSpellGroup(newAura->Id) == 1)
4320 return nullptr;
4321
4322 // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times
4323 if (!newAura->IsMultiSlotAura())
4324 {
4325 // check if cast item changed
4326 ObjectGuid castItemGUID;
4327 if (castItem)
4328 castItemGUID = castItem->GetGUID();
4329
4330 // find current aura from spell and change it's stackamount, or refresh it's duration
4331 if (Aura* foundAura = GetOwnedAura(newAura->Id, newAura->HasAttribute(SPELL_ATTR0_CU_SINGLE_AURA_STACK) ? ObjectGuid::Empty : casterGUID, newAura->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
4332 {
4333 // effect masks do not match
4334 // extremely rare case
4335 // let's just recreate aura
4336 if (effMask != foundAura->GetEffectMask())
4337 return nullptr;
4338
4339 // update basepoints with new values - effect amount will be recalculated in ModStackAmount
4340 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4341 {
4342 if (!foundAura->HasEffect(i))
4343 continue;
4344
4345 int bp;
4346 if (baseAmount)
4347 bp = *(baseAmount + i);
4348 else
4349 bp = foundAura->GetSpellInfo()->Effects[i].BasePoints;
4350
4351 int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount));
4352 *oldBP = bp;
4353 }
4354
4355 // correct cast item guid if needed
4356 if (castItemGUID != foundAura->GetCastItemGUID())
4357 {
4358 ObjectGuid* oldGUID = const_cast<ObjectGuid*>(&foundAura->m_castItemGuid);
4359 *oldGUID = castItemGUID;
4360 }
4361
4362 // try to increase stack amount
4363 foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, periodicReset);
4364 sScriptMgr->OnAuraApply(this, foundAura);
4365 return foundAura;
4366 }
4367 }
4368
4369 return nullptr;
4370}
std::int32_t int32
Definition: Define.h:103
@ SPELL_ATTR0_CU_ENCHANT_PROC
Definition: SpellInfo.h:176
@ SPELL_ATTR0_CU_SINGLE_AURA_STACK
Definition: SpellInfo.h:198
#define sSpellMgr
Definition: SpellMgr.h:825
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:109
Definition: ObjectGuid.h:118
static ObjectGuid const Empty
Definition: ObjectGuid.h:120
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
Definition: Unit.cpp:4715

References ASSERT, AURA_REMOVE_BY_DEFAULT, ObjectGuid::Empty, Object::GetGUID(), GetOwnedAura(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsMultiSlotAura(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_ENCHANT_PROC, SPELL_ATTR0_CU_SINGLE_AURA_STACK, sScriptMgr, and sSpellMgr.

Referenced by Aura::TryRefreshStackOrCreate().

◆ _UnapplyAura() [1/2]

void Unit::_UnapplyAura ( AuraApplication aurApp,
AuraRemoveMode  removeMode 
)
4602{
4603 // aura can be removed from unit only if it's applied on it, shouldn't happen
4604 ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
4605
4606 uint32 spellId = aurApp->GetBase()->GetId();
4607 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4608
4609 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4610 {
4611 if (iter->second == aurApp)
4612 {
4613 _UnapplyAura(iter, removeMode);
4614 return;
4615 }
4616 else
4617 ++iter;
4618 }
4619 ABORT();
4620}
#define ABORT
Definition: Errors.h:76
std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
Definition: Unit.h:641
void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
Definition: Unit.cpp:4509

References _UnapplyAura(), ABORT, ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), and m_appliedAuras.

◆ _UnapplyAura() [2/2]

void Unit::_UnapplyAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  removeMode 
)
4510{
4511 AuraApplication* aurApp = i->second;
4512 ASSERT(aurApp);
4513 ASSERT(!aurApp->GetRemoveMode());
4514 ASSERT(aurApp->GetTarget() == this);
4515
4516 aurApp->SetRemoveMode(removeMode);
4517 Aura* aura = aurApp->GetBase();
4518 LOG_DEBUG("spells.aura", "Aura {} now is remove mode {}", aura->GetId(), removeMode);
4519
4520 // dead loop is killing the server probably
4521 ASSERT(m_removedAurasCount < 0xFFFFFFFF);
4522
4524
4525 Unit* caster = aura->GetCaster();
4526
4527 // Remove all pointers from lists here to prevent possible pointer invalidation on spellcast/auraapply/auraremove
4528 m_appliedAuras.erase(i);
4529
4530 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4531 // xinef: event if it gets removed, it will be reapplied in a second
4532 if (aura->GetSpellInfo()->AuraInterruptFlags && this == aura->GetOwner())
4533 {
4534 m_interruptableAuras.remove(aurApp);
4536 }
4537
4538 bool auraStateFound = false;
4539 AuraStateType auraState = aura->GetSpellInfo()->GetAuraState();
4540 if (auraState)
4541 {
4542 bool canBreak = false;
4543 // Get mask of all aurastates from remaining auras
4544 for (AuraStateAurasMap::iterator itr = m_auraStateAuras.lower_bound(auraState); itr != m_auraStateAuras.upper_bound(auraState) && !(auraStateFound && canBreak);)
4545 {
4546 if (itr->second == aurApp)
4547 {
4548 m_auraStateAuras.erase(itr);
4549 itr = m_auraStateAuras.lower_bound(auraState);
4550 canBreak = true;
4551 continue;
4552 }
4553 auraStateFound = true;
4554 ++itr;
4555 }
4556 }
4557
4558 aurApp->_Remove();
4559 aura->_UnapplyForTarget(this, caster, aurApp);
4560
4561 // remove effects of the spell - needs to be done after removing aura from lists
4562 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4563 {
4564 if (aurApp->HasEffect(itr))
4565 aurApp->_HandleEffect(itr, false);
4566 }
4567
4568 // all effect mustn't be applied
4569 ASSERT(!aurApp->GetEffectMask());
4570
4571 // Remove totem at next update if totem loses its aura
4572 if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && IsTotem() && GetGUID() == aura->GetCasterGUID())
4573 {
4574 if (ToTotem()->GetSpell() == aura->GetId() && ToTotem()->GetTotemType() == TOTEM_PASSIVE)
4575 ToTotem()->setDeathState(DeathState::JustDied);
4576 }
4577
4578 // Remove aurastates only if needed and were not found
4579 if (auraState)
4580 {
4581 if (!auraStateFound)
4582 ModifyAuraState(auraState, false);
4583 else
4584 {
4585 // update for casters, some shouldn't 'see' the aura state
4586 uint32 aStateMask = (1 << (auraState - 1));
4587 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) != 0)
4589 }
4590 }
4591
4592 aura->HandleAuraSpecificMods(aurApp, caster, false, false);
4593
4594 // only way correctly remove all auras from list
4595 //if (removedAuras != m_removedAurasCount) new aura may be added
4596 i = m_appliedAuras.begin();
4597
4598 sScriptMgr->OnAuraRemove(this, aurApp, removeMode);
4599}
@ TOTEM_PASSIVE
Definition: Totem.h:25
@ AURA_REMOVE_BY_EXPIRE
Definition: SpellAuraDefines.h:395
void setDeathState(DeathState s, bool despawn=false) override
Definition: TemporarySummon.cpp:395
Totem * ToTotem()
Definition: Unit.h:1741
void UpdateInterruptMask()
Definition: Unit.cpp:741
bool IsTotem() const
Definition: Unit.h:755
Unit * GetTarget() const
Definition: SpellAuras.h:61
void SetRemoveMode(AuraRemoveMode mode)
Definition: SpellAuras.h:72
void _Remove()
Definition: SpellAuras.cpp:94
bool HasEffect(uint8 effect) const
Definition: SpellAuras.h:67
virtual void _UnapplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition: SpellAuras.cpp:515

References AuraApplication::_HandleEffect(), AuraApplication::_Remove(), Aura::_UnapplyForTarget(), ASSERT, AURA_REMOVE_BY_EXPIRE, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), Aura::GetCasterGUID(), AuraApplication::GetEffectMask(), Object::GetGUID(), Aura::GetId(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), AuraApplication::GetTarget(), Aura::HandleAuraSpecificMods(), AuraApplication::HasEffect(), IsTotem(), LOG_DEBUG, m_appliedAuras, m_auraStateAuras, m_interruptableAuras, m_removedAurasCount, MAX_SPELL_EFFECTS, ModifyAuraState(), PER_CASTER_AURA_STATE_MASK, Minion::setDeathState(), AuraApplication::SetRemoveMode(), sScriptMgr, TOTEM_PASSIVE, ToTotem(), UNIT_FIELD_AURASTATE, and UpdateInterruptMask().

Referenced by Aura::_Remove(), _UnapplyAura(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAura(), and RemoveEvadeAuras().

◆ _UnregisterDynObject()

void Unit::_UnregisterDynObject ( DynamicObject dynObj)
6068{
6069 m_dynObj.remove(dynObj);
6070}

References m_dynObj.

Referenced by DynamicObject::UnbindFromCaster().

◆ _UpdateAutoRepeatSpell()

void Unit::_UpdateAutoRepeatSpell ( )
protected
3863{
3864 SpellInfo const* spellProto = nullptr;
3866 {
3868 }
3869
3870 if (!spellProto)
3871 {
3872 return;
3873 }
3874
3875 static uint32 const HUNTER_AUTOSHOOT = 75;
3876
3877 // Check "realtime" interrupts
3878 if ((IsPlayer() && ToPlayer()->isMoving()) || IsNonMeleeSpellCast(false, false, true, spellProto->Id == HUNTER_AUTOSHOOT))
3879 {
3880 // cancel wand shoot
3881 if (spellProto->Id != HUNTER_AUTOSHOOT)
3883 m_AutoRepeatFirstCast = true;
3884 return;
3885 }
3886
3888 {
3890 }
3891
3892 m_AutoRepeatFirstCast = false;
3893
3894 // Check for ranged attack timer
3896 {
3898 if (result != SPELL_CAST_OK)
3899 {
3900 if (spellProto->Id != HUNTER_AUTOSHOOT)
3901 {
3903 }
3904
3905 return;
3906 }
3907
3908 // We want to shoot
3909 Spell* spell = new Spell(this, spellProto, TRIGGERED_FULL_MASK);
3910 spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets));
3911
3912 // Reset attack
3914 }
3915}
@ CURRENT_AUTOREPEAT_SPELL
Definition: Unit.h:540
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition: SpellDefines.h:148
SpellCastResult
Definition: SharedDefines.h:948
@ SPELL_CAST_OK
Definition: SharedDefines.h:1138
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition: Unit.cpp:4020
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition: Unit.cpp:4057
void setAttackTimer(WeaponAttackType type, int32 time)
Definition: Unit.h:680
bool isMoving() const
Definition: Unit.h:1722
int32 getAttackTimer(WeaponAttackType type) const
Definition: Unit.h:682
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition: Unit.h:683
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition: Unit.cpp:643
Definition: Spell.h:284
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition: Spell.cpp:3467
SpellCastResult CheckCast(bool strict)
Definition: Spell.cpp:5643
SpellInfo const *const m_spellInfo
Definition: Spell.h:520

References Spell::CheckCast(), CURRENT_AUTOREPEAT_SPELL, getAttackTimer(), SpellInfo::Id, InterruptSpell(), isAttackReady(), isMoving(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_spellInfo, Spell::prepare(), RANGED_ATTACK, resetAttackTimer(), setAttackTimer(), SPELL_CAST_OK, Object::ToPlayer(), and TRIGGERED_FULL_MASK.

Referenced by _UpdateSpells().

◆ _UpdateSpells()

void Unit::_UpdateSpells ( uint32  time)
protected
3805{
3808
3809 // remove finished spells from current pointers
3810 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
3811 {
3812 if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
3813 {
3815 m_currentSpells[i] = nullptr; // remove pointer
3816 }
3817 }
3818
3819 // m_auraUpdateIterator can be updated in indirect called code at aura remove to skip next planned to update but removed auras
3821 {
3822 Aura* i_aura = m_auraUpdateIterator->second;
3823 ++m_auraUpdateIterator; // need shift to next for allow update if need into aura update
3824 i_aura->UpdateOwner(time, this);
3825 }
3826
3827 // remove expired auras - do that after updates(used in scripts?)
3828 for (AuraMap::iterator i = m_ownedAuras.begin(); i != m_ownedAuras.end();)
3829 {
3830 if (i->second->IsExpired())
3832 else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
3833 RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
3834 else
3835 ++i;
3836 }
3837
3838 for (VisibleAuraMap::iterator itr = m_visibleAuras.begin(); itr != m_visibleAuras.end(); ++itr)
3839 if (itr->second->IsNeedClientUpdate())
3840 itr->second->ClientUpdate();
3841
3843
3844 if (!m_gameObj.empty())
3845 {
3846 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
3847 {
3848 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
3849 if (!go->isSpawned())
3850 {
3851 go->SetOwnerGUID(ObjectGuid::Empty);
3852 go->SetRespawnTime(0);
3853 go->Delete();
3854 m_gameObj.erase(itr++);
3855 continue;
3856 }
3857 ++itr;
3858 }
3859 }
3860}
@ AURA_REMOVE_BY_CANCEL
Definition: SpellAuraDefines.h:393
@ SPELL_STATE_FINISHED
Definition: Spell.h:226
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:187
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:118
Definition: GameObject.h:121
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4660
void _UpdateAutoRepeatSpell()
Definition: Unit.cpp:3862
VisibleAuraMap m_visibleAuras
Definition: Unit.h:1860
void UpdateOwner(uint32 diff, WorldObject *owner)
Definition: SpellAuras.cpp:756

References _DeleteRemovedAuras(), _UpdateAutoRepeatSpell(), AURA_REMOVE_BY_CANCEL, AURA_REMOVE_BY_EXPIRE, CURRENT_AUTOREPEAT_SPELL, CURRENT_MAX_SPELL, ObjectGuid::Empty, ObjectAccessor::GetGameObject(), Object::GetGUID(), ObjectAccessor::GetWorldObject(), m_auraUpdateIterator, m_currentSpells, m_gameObj, m_ownedAuras, m_visibleAuras, RemoveOwnedAura(), Spell::SetReferencedFromCurrent(), SPELL_STATE_FINISHED, and Aura::UpdateOwner().

Referenced by Update().

◆ AddAura() [1/2]

Aura * Unit::AddAura ( SpellInfo const *  spellInfo,
uint8  effMask,
Unit target 
)
18782{
18783 if (!spellInfo)
18784 return nullptr;
18785
18786 if (target->IsImmunedToSpell(spellInfo))
18787 return nullptr;
18788
18789 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
18790 {
18791 if (!(effMask & (1 << i)))
18792 continue;
18793 if (target->IsImmunedToSpellEffect(spellInfo, i))
18794 effMask &= ~(1 << i);
18795 }
18796
18797 if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
18798 {
18799 aura->ApplyForTargets();
18800 return aura;
18801 }
18802 return nullptr;
18803}
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, uint32 index) const
Definition: Unit.cpp:12927
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, Spell const *spell=nullptr)
Definition: Unit.cpp:12837
static Aura * TryRefreshStackOrCreate(SpellInfo const *spellproto, uint8 tryEffMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool *refresh=nullptr, bool periodicReset=false)
Definition: SpellAuras.cpp:326

References Aura::ApplyForTargets(), IsImmunedToSpell(), IsImmunedToSpellEffect(), MAX_SPELL_EFFECTS, and Aura::TryRefreshStackOrCreate().

◆ AddAura() [2/2]

Aura * Unit::AddAura ( uint32  spellId,
Unit target 
)
18767{
18768 if (!target)
18769 return nullptr;
18770
18771 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
18772 if (!spellInfo)
18773 return nullptr;
18774
18775 if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))
18776 return nullptr;
18777
18778 return AddAura(spellInfo, MAX_EFFECT_MASK, target);
18779}
#define MAX_EFFECT_MASK
Definition: DBCStructure.h:1638
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
Definition: SharedDefines.h:456
@ SPELL_ATTR0_PASSIVE
Definition: SharedDefines.h:388
Aura * AddAura(uint32 spellId, Unit *target)
Definition: Unit.cpp:18766
bool HasAttribute(SpellAttr0 attribute) const
Definition: SpellInfo.h:415

References AddAura(), SpellInfo::HasAttribute(), IsAlive(), MAX_EFFECT_MASK, SPELL_ATTR0_PASSIVE, SPELL_ATTR2_ALLOW_DEAD_TARGET, and sSpellMgr.

Referenced by AddAura(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::AttackStart(), boss_anzu::boss_anzu(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoTriggersOnSpellHit(), npc_anubisath_sentinel::aqsentinelAI::GainSentinelAbility(), AuraEffect::HandleAuraDummy(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterAdd(), gm_commandscript::HandleGMVisibleCommand(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_transitus_shield_beam_aura::HandleOnEffectApply(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Guardian::InitStatsForLevel(), boss_gahzranka::boss_gahzrankaAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_dalaran_warrior::npc_dalaran_warriorAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Creature::LoadCreaturesAddon(), npc_brew_bubble::MoveInLineOfSight(), npc_pet_gen_plump_turkey::MovementInform(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_empowered_aura::OnPeriodic(), instance_stratholme::instance_stratholme_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), AreaTrigger_at_area_52_entrance::OnTrigger(), Player::ProcessDelayedOperations(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_corrupted_totem::Reset(), npc_troll_volunteer::npc_troll_volunteerAI::Reset(), npc_vengeful_shade::npc_vengeful_shadeAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_magus_telestra::boss_magus_telestraAI::Reset(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_archavon::boss_archavonAI::Reset(), boss_emalon::boss_emalonAI::Reset(), boss_koralon::boss_koralonAI::Reset(), boss_toravon::boss_toravonAI::Reset(), npc_dalaran_mage::npc_dalaran_mageAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), npc_pet_pri_shadowfiend::Reset(), Player::SendInitialPacketsAfterAddToMap(), npc_corrupted_totem::SetAura(), SetAuraStack(), Player::SetGMVisible(), Player::SetIsSpectator(), npc_artorius::npc_artoriusAI::SpellHit(), npc_simone::npc_simoneAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHitTarget(), Spell::SummonGuardian(), boss_netherspite::SwitchToPortalPhase(), boss_gyth::boss_gythAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), boss_netherspite::UpdatePortals(), and npc_emily::npc_emilyAI::WaypointReached().

◆ AddComboPointHolder()

void Unit::AddComboPointHolder ( Unit unit)
inline
1641{ m_ComboPointHolders.insert(unit); }
std::unordered_set< Unit * > m_ComboPointHolders
Definition: Unit.h:1929

References m_ComboPointHolders.

Referenced by AddComboPoints().

◆ AddComboPoints() [1/2]

void Unit::AddComboPoints ( int8  count)
inline
1637{ AddComboPoints(nullptr, count); }
void AddComboPoints(Unit *target, int8 count)
Definition: Unit.cpp:16752

References AddComboPoints().

Referenced by AddComboPoints().

◆ AddComboPoints() [2/2]

void Unit::AddComboPoints ( Unit target,
int8  count 
)
16753{
16754 if (!count)
16755 {
16756 return;
16757 }
16758
16759 if (target && target != m_comboTarget)
16760 {
16761 if (m_comboTarget)
16762 {
16764 }
16765
16766 m_comboTarget = target;
16767 m_comboPoints = count;
16768 target->AddComboPointHolder(this);
16769 }
16770 else
16771 {
16772 m_comboPoints = std::max<int8>(std::min<int8>(m_comboPoints + count, 5), 0);
16773 }
16774
16776}
void SendComboPoints()
Definition: Unit.cpp:16795
void AddComboPointHolder(Unit *unit)
Definition: Unit.h:1641
void RemoveComboPointHolder(Unit *unit)
Definition: Unit.h:1642

References AddComboPointHolder(), m_comboPoints, m_comboTarget, RemoveComboPointHolder(), and SendComboPoints().

Referenced by Spell::_handle_finish_phase(), AuraEffect::HandleAuraRetainComboPoints(), and ProcDamageAndSpellFor().

◆ AddExtraAttacks()

void Unit::AddExtraAttacks ( uint32  count)
2730{
2732 if (!targetGUID)
2733 {
2734 if (ObjectGuid selection = GetTarget())
2735 {
2736 targetGUID = selection; // Spell was cast directly (not triggered by aura)
2737 }
2738 else
2739 return;
2740 }
2741
2742 extraAttacksTargets[targetGUID] += count;
2743}
std::unordered_map< ObjectGuid, uint32 > extraAttacksTargets
Definition: Unit.h:1942
ObjectGuid _lastDamagedTargetGuid
Definition: Unit.h:1943
ObjectGuid GetTarget() const
Definition: Unit.h:1775

References _lastDamagedTargetGuid, extraAttacksTargets, and GetTarget().

Referenced by Spell::EffectAddExtraAttacks().

◆ AddExtraUnitMovementFlag()

void Unit::AddExtraUnitMovementFlag ( uint16  f)
inline
1620{ m_movementInfo.flags2 |= f; }
uint16 flags2
Definition: Object.h:278
MovementInfo m_movementInfo
Definition: Object.h:607

References MovementInfo::flags2, and WorldObject::m_movementInfo.

Referenced by Vehicle::InitMovementInfoForBase().

◆ addFollower()

void Unit::addFollower ( FollowerReference pRef)
inline
void insertFirst(LinkedListElement *pElem)
Definition: LinkedList.h:105
FollowerRefMgr m_FollowingRefMgr
Definition: Unit.h:1925

References LinkedListHead::insertFirst(), and m_FollowingRefMgr.

Referenced by FollowerReference::targetObjectBuildLink().

◆ AddGameObject()

void Unit::AddGameObject ( GameObject gameObj)
6124{
6125 if (!gameObj || gameObj->GetOwnerGUID())
6126 return;
6127
6128 m_gameObj.push_back(gameObj->GetGUID());
6129 gameObj->SetOwnerGUID(GetGUID());
6130
6131 if (IsPlayer() && gameObj->GetSpellId())
6132 {
6133 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
6134 // Need disable spell use for owner
6135 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6136 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6137 ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, nullptr, true);
6138 }
6139}
uint32 GetSpellId() const
Definition: GameObject.h:182
void SetOwnerGUID(ObjectGuid owner)
Definition: GameObject.h:164
ObjectGuid GetOwnerGUID() const
Definition: GameObject.h:174
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition: Player.cpp:10863
bool IsCooldownStartedOnEvent() const
Definition: SpellInfo.cpp:1211

References Player::AddSpellAndCategoryCooldowns(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, GameObject::SetOwnerGUID(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::EffectDuel(), Spell::EffectSummonObject(), Spell::EffectTransmitted(), npc_midsummer_bonfire::Ignite(), and WorldObject::SummonGameObject().

◆ addHatedBy()

void Unit::addHatedBy ( HostileReference pHostileReference)
inline

◆ AddInterruptMask()

void Unit::AddInterruptMask ( uint32  mask)
inline
1505{ m_interruptMask |= mask; }

References m_interruptMask.

Referenced by _CreateAuraApplication(), and Spell::handle_immediate().

◆ AddPetAura()

void Unit::AddPetAura ( PetAura const *  petSpell)
17201{
17202 if (GetTypeId() != TYPEID_PLAYER)
17203 return;
17204
17205 m_petAuras.insert(petSpell);
17206 if (Pet* pet = ToPlayer()->GetPet())
17207 pet->CastPetAura(petSpell);
17208 else if (Unit* charm = GetCharm())
17209 charm->CastPetAura(petSpell);
17210}
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:218
Definition: Pet.h:41
Unit * GetCharm() const
Definition: Unit.cpp:10592
PetAuraSet m_petAuras
Definition: Unit.h:1676

References GetCharm(), Object::GetTypeId(), m_petAuras, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by Spell::EffectDummy(), and AuraEffect::HandleAuraDummy().

◆ AddPlayerToVision()

void Unit::AddPlayerToVision ( Player player)
11091{
11092 if (m_sharedVision.empty())
11093 {
11094 setActive(true);
11095 SetWorldObject(true);
11096 }
11097 m_sharedVision.push_back(player);
11098 player->m_isInSharedVisionOf.insert(this);
11099}
void SetWorldObject(bool apply)
Definition: Object.cpp:1066
void setActive(bool isActiveObject)
Definition: Object.cpp:1085

References Player::m_isInSharedVisionOf, m_sharedVision, WorldObject::setActive(), and WorldObject::SetWorldObject().

◆ AddPointedBy()

void Unit::AddPointedBy ( SafeUnitPointer sup)
inline
1747{ SafeUnitPointerSet.insert(sup); }
std::set< SafeUnitPointer * > SafeUnitPointerSet
Definition: Unit.h:1746

References SafeUnitPointerSet.

Referenced by SafeUnitPointer::SetPointedTo().

◆ AddSpellCooldown()

virtual void Unit::AddSpellCooldown ( uint32  ,
uint32  ,
uint32  ,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
inlinevirtual

◆ AddThreat()

void Unit::AddThreat ( Unit victim,
float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  threatSpell = nullptr 
)
14567{
14568 // Only mobs can manage threat lists
14570 {
14571 m_ThreatMgr.AddThreat(victim, fThreat, schoolMask, threatSpell);
14572 }
14573}
@ UNIT_STATE_EVADE
Definition: UnitDefines.h:170
void AddThreat(Unit *victim, float threat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition: ThreatMgr.cpp:436
bool CanHaveThreatList() const
Definition: Unit.cpp:14527
bool HasUnitState(const uint32 f) const
Definition: Unit.h:738

References ThreatMgr::AddThreat(), CanHaveThreatList(), HasUnitState(), m_ThreatMgr, and UNIT_STATE_EVADE.

Referenced by Attack(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alyson_antille::boss_alyson_antilleAI::AttackStart(), boss_gazakrothAI::AttackStart(), boss_slither::boss_slitherAI::AttackStart(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::AttackStart(), npc_capernian::AttackStart(), npc_dirt_mound::ChaseNewTarget(), boss_buru::ChaseNewVictim(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DamageTaken(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), DealDamage(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), CreatureAI::DoZoneInCombat(), Spell::EffectThreat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), npc_raging_flames::FixateRandomTarget(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), spell_morogrim_tidewalker_water_globule_new_target::HandleDummy(), HandleDummyAuraProc(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), AuraEffect::HandlePeriodicManaLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_the_lich_king_vile_spirit_move_target_search::HandleScript(), spell_pursue::HandleScript(), Spell::HandleThreatSpells(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_tiger_matriarch::npc_tiger_matriarchAI::IsSummonedBy(), npc_little_ooze::npc_little_oozeAI::IsSummonedBy(), npc_malchezaar_axe::JustEngagedWith(), npc_thaladred::JustEngagedWith(), boss_buru::JustEngagedWith(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), boss_curator::JustSummoned(), boss_sacrolash::boss_sacrolashAI::JustSummoned(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustSummoned(), npc_akama_illidan::npc_akama_illidanAI::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), boss_shade_of_akama::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_mage_mirror_image::MySelectNextTarget(), SmartScript::ProcessAction(), RemoveCharmedBy(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::Reset(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::Reset(), npc_tainted_elemental::Reset(), npc_pet_hunter_snake_trap::Reset(), boss_romulo::ScheduleCombat(), boss_supremus::SchedulePhase(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), brann_bronzebeard::brann_bronzebeardAI::SummonCreatures(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), and npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI().

◆ AddToWorld()

void Unit::AddToWorld ( )
overridevirtual

Reimplemented from WorldObject.

15602{
15603 if (!IsInWorld())
15604 {
15606 }
15607}
void AddToWorld() override
Definition: Object.cpp:1176

References WorldObject::AddToWorld(), and Object::IsInWorld().

Referenced by Creature::AddToWorld(), Pet::AddToWorld(), and Player::AddToWorld().

◆ AddUnitMovementFlag()

◆ AddUnitState()

void Unit::AddUnitState ( uint32  f)
inline
737{ m_state |= f; }

References m_state.

Referenced by _ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), MotionTransport::AddPassenger(), Attack(), boss_prince_keleseth_icc::boss_prince_kelesethAI::boss_prince_kelesethAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::boss_prince_taldaramAI(), boss_prince_valanar_icc::boss_prince_valanarAI::boss_prince_valanarAI(), Creature::Create(), MotionTransport::CreateNPCPassenger(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), boss_nightbane::DoAction(), WaypointMovementGenerator< Creature >::DoInitialize(), RandomMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoReset(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_jindo::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), Creature::FocusTarget(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetCastSpellOpcode(), RotateMovementGenerator::Initialize(), DistractMovementGenerator::Initialize(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), Player::LoadFromDB(), boss_ayamiss::MovementInform(), boss_lady_vashj::MovementInform(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_pet_gen_wind_rider_cub::npc_pet_gen_wind_rider_cub(), npc_corrupted_totem::Reset(), boss_jedoga_shadowseeker::Reset(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), boss_hungarfen::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), SetCharmedBy(), SetContestedPvP(), SetControlled(), SetCurrentCastedSpell(), Player::setDeathState(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), WaypointMovementGenerator< Creature >::StartMove(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), and boss_svala::boss_svalaAI::UpdateAI().

◆ AddUnitTypeMask()

void Unit::AddUnitTypeMask ( uint32  mask)
inline
748{ m_unitTypeMask |= mask; }

References m_unitTypeMask.

◆ ApplyAttackTimePercentMod()

void Unit::ApplyAttackTimePercentMod ( WeaponAttackType  att,
float  val,
bool  apply 
)
16969{
16970 float remainingTimePct = std::max((float)m_attackTimer[att], 0.0f) / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
16971 if (val > 0)
16972 {
16974 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, val, !apply);
16975 }
16976 else
16977 {
16979 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, -val, apply);
16980 }
16981 m_attackTimer[att] = uint32(GetAttackTime(att) * m_modAttackSpeedPct[att] * remainingTimePct);
16982}
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition: Util.h:50
std::uint16_t uint16
Definition: Define.h:108
@ UNIT_FIELD_BASEATTACKTIME
Definition: UpdateFields.h:120
void ApplyPercentModFloatValue(uint16 index, float val, bool apply)
Definition: Object.cpp:829
uint32 GetAttackTime(WeaponAttackType att) const
Definition: Unit.h:811

References Object::ApplyPercentModFloatValue(), ApplyPercentModFloatVar(), GetAttackTime(), m_attackTimer, m_modAttackSpeedPct, and UNIT_FIELD_BASEATTACKTIME.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleAuraModRangedHaste(), AuraEffect::HandleModAttackSpeed(), AuraEffect::HandleModCombatSpeedPct(), AuraEffect::HandleModMeleeRangedSpeedPct(), AuraEffect::HandleModMeleeSpeedPct(), and AuraEffect::HandleRangedAmmoHaste().

◆ ApplyCastTimePercentMod()

void Unit::ApplyCastTimePercentMod ( float  val,
bool  apply 
)
16985{
16986 if (val > 0)
16988 else
16990}
@ UNIT_MOD_CAST_SPEED
Definition: UpdateFields.h:137

References Object::ApplyPercentModFloatValue(), and UNIT_MOD_CAST_SPEED.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleModCastingSpeed(), and AuraEffect::HandleModCombatSpeedPct().

◆ ApplyDiminishingAura()

void Unit::ApplyDiminishingAura ( DiminishingGroup  group,
bool  apply 
)
15040{
15041 // Checking for existing in the table
15042 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15043 {
15044 if (i->DRGroup != group)
15045 continue;
15046
15047 if (apply)
15048 i->stack += 1;
15049 else if (i->stack)
15050 {
15051 i->stack -= 1;
15052 // Remember time after last aura from group removed
15053 if (i->stack == 0)
15054 i->hitTime = GameTime::GetGameTimeMS().count();
15055 }
15056 break;
15057 }
15058}
Milliseconds GetGameTimeMS()
Definition: GameTime.cpp:43
Diminishing m_Diminishing
Definition: Unit.h:1921

References GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by UnitAura::_ApplyForTarget(), and UnitAura::_UnapplyForTarget().

◆ ApplyDiminishingToDuration()

float Unit::ApplyDiminishingToDuration ( DiminishingGroup  group,
int32 duration,
Unit caster,
DiminishingLevels  Level,
int32  limitduration 
)
14961{
14962 // xinef: dont apply diminish to self casts
14963 if (duration == -1 || group == DIMINISHING_NONE)
14964 return 1.0f;
14965
14966 // test pet/charm masters instead pets/charmeds
14967 Unit const* targetOwner = GetOwner();
14968 Unit const* casterOwner = caster->GetOwner();
14969
14970 // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
14971 if (limitduration > 0 && duration > limitduration)
14972 {
14973 Unit const* target = targetOwner ? targetOwner : this;
14974 Unit const* source = casterOwner ? casterOwner : caster;
14975
14976 if ((target->IsPlayer()
14978 && source->IsPlayer())
14979 duration = limitduration;
14980 }
14981
14982 float mod = 1.0f;
14983
14984 if (group == DIMINISHING_TAUNT)
14985 {
14986 if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS))
14987 {
14988 DiminishingLevels diminish = Level;
14989 switch (diminish)
14990 {
14992 break;
14994 mod = 0.65f;
14995 break;
14997 mod = 0.4225f;
14998 break;
15000 mod = 0.274625f;
15001 break;
15003 mod = 0.0f;
15004 break;
15005 default:
15006 break;
15007 }
15008 }
15009 }
15010 // Some diminishings applies to mobs too (for example, Stun)
15012 && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer()))
15013 || (GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH)))
15015 {
15016 DiminishingLevels diminish = Level;
15017 switch (diminish)
15018 {
15020 break;
15022 mod = 0.5f;
15023 break;
15025 mod = 0.25f;
15026 break;
15028 mod = 0.0f;
15029 break;
15030 default:
15031 break;
15032 }
15033 }
15034
15035 duration = int32(duration * mod);
15036 return mod;
15037}
DiminishingLevels
Definition: Unit.h:262
@ DIMINISHING_LEVEL_3
Definition: Unit.h:265
@ DIMINISHING_LEVEL_1
Definition: Unit.h:263
@ DIMINISHING_LEVEL_4
Definition: Unit.h:267
@ DIMINISHING_LEVEL_IMMUNE
Definition: Unit.h:266
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition: Unit.h:268
@ DIMINISHING_LEVEL_2
Definition: Unit.h:264
@ CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS
Definition: CreatureData.h:65
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
Definition: CreatureData.h:66
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
Definition: SpellMgr.cpp:246
@ DIMINISHING_NONE
Definition: SharedDefines.h:3258
@ DIMINISHING_TAUNT
Definition: SharedDefines.h:3276
@ DRTYPE_PLAYER
Definition: SharedDefines.h:3251
@ DRTYPE_ALL
Definition: SharedDefines.h:3252
uint32 flags_extra
Definition: CreatureData.h:249

References CREATURE_FLAG_EXTRA_ALL_DIMINISH, CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS, DIMINISHING_LEVEL_1, DIMINISHING_LEVEL_2, DIMINISHING_LEVEL_3, DIMINISHING_LEVEL_4, DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, DIMINISHING_NONE, DIMINISHING_TAUNT, DRTYPE_ALL, DRTYPE_PLAYER, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetDiminishingReturnsGroupType(), GetOwner(), Object::GetTypeId(), Object::IsPlayer(), Object::ToCreature(), and TYPEID_UNIT.

Referenced by Spell::DoSpellHitOnUnit().

◆ ApplyEffectModifiers()

float Unit::ApplyEffectModifiers ( SpellInfo const *  spellProto,
uint8  effect_index,
float  value 
) const
14743{
14744 if (Player* modOwner = GetSpellModOwner())
14745 {
14746 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_ALL_EFFECTS, value);
14747 switch (effect_index)
14748 {
14749 case 0:
14750 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT1, value);
14751 break;
14752 case 1:
14753 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT2, value);
14754 break;
14755 case 2:
14756 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT3, value);
14757 break;
14758 }
14759 }
14760 return value;
14761}
@ SPELLMOD_EFFECT2
Definition: SpellDefines.h:89
@ SPELLMOD_ALL_EFFECTS
Definition: SpellDefines.h:85
@ SPELLMOD_EFFECT3
Definition: SpellDefines.h:100
@ SPELLMOD_EFFECT1
Definition: SpellDefines.h:80
Player * GetSpellModOwner() const
Definition: Unit.cpp:16491

References GetSpellModOwner(), SpellInfo::Id, SPELLMOD_ALL_EFFECTS, SPELLMOD_EFFECT1, SPELLMOD_EFFECT2, and SPELLMOD_EFFECT3.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellEffectInfo::CalcValue(), and Spell::EffectSchoolDMG().

◆ ApplyResilience()

void Unit::ApplyResilience ( Unit const *  victim,
float *  crit,
int32 damage,
bool  isCrit,
CombatRating  type 
)
static
18831{
18832 // player mounted on multi-passenger mount is also classified as vehicle
18833 if (victim->IsVehicle() && victim->GetTypeId() != TYPEID_PLAYER)
18834 return;
18835
18836 Unit const* target = nullptr;
18837 if (victim->IsPlayer())
18838 target = victim;
18839 else if (victim->GetTypeId() == TYPEID_UNIT)
18840 {
18841 if (Unit* owner = victim->GetOwner())
18842 if (owner->IsPlayer())
18843 target = owner;
18844 }
18845
18846 if (!target)
18847 return;
18848
18849 switch (type)
18850 {
18852 // Crit chance reduction works against nonpets
18853 if (crit)
18854 *crit -= target->GetMeleeCritChanceReduction();
18855 if (damage)
18856 {
18857 if (isCrit)
18858 *damage -= target->GetMeleeCritDamageReduction(*damage);
18859 *damage -= target->GetMeleeDamageReduction(*damage);
18860 }
18861 break;
18863 // Crit chance reduction works against nonpets
18864 if (crit)
18865 *crit -= target->GetRangedCritChanceReduction();
18866 if (damage)
18867 {
18868 if (isCrit)
18869 *damage -= target->GetRangedCritDamageReduction(*damage);
18870 *damage -= target->GetRangedDamageReduction(*damage);
18871 }
18872 break;
18874 // Crit chance reduction works against nonpets
18875 if (crit)
18876 *crit -= target->GetSpellCritChanceReduction();
18877 if (damage)
18878 {
18879 if (isCrit)
18880 *damage -= target->GetSpellCritDamageReduction(*damage);
18881 *damage -= target->GetSpellDamageReduction(*damage);
18882 }
18883 break;
18884 default:
18885 break;
18886 }
18887}
@ CR_CRIT_TAKEN_RANGED
Definition: Unit.h:232
@ CR_CRIT_TAKEN_SPELL
Definition: Unit.h:233
@ CR_CRIT_TAKEN_MELEE
Definition: Unit.h:231
float GetSpellCritChanceReduction() const
Definition: Unit.h:925
float GetRangedCritChanceReduction() const
Definition: Unit.h:924
uint32 GetSpellCritDamageReduction(uint32 damage) const
Definition: Unit.h:930
float GetMeleeCritChanceReduction() const
Definition: Unit.h:923
uint32 GetRangedDamageReduction(uint32 damage) const
Definition: Unit.h:934
uint32 GetRangedCritDamageReduction(uint32 damage) const
Definition: Unit.h:929
uint32 GetMeleeCritDamageReduction(uint32 damage) const
Definition: Unit.h:928
uint32 GetSpellDamageReduction(uint32 damage) const
Definition: Unit.h:935
uint32 GetMeleeDamageReduction(uint32 damage) const
Definition: Unit.h:933

References CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, GetMeleeCritChanceReduction(), GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetOwner(), GetRangedCritChanceReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritChanceReduction(), GetSpellCritDamageReduction(), GetSpellDamageReduction(), Object::GetTypeId(), Object::IsPlayer(), IsVehicle(), TYPEID_PLAYER, and TYPEID_UNIT.

Referenced by CalculateSpellDamageTaken(), GetUnitCriticalChance(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_valkyr_touch::spell_valkyr_touchAuraScript::PrepareAuraScript(), and SpellTakenCritChance().

◆ ApplyResistanceBuffModsMod()

void Unit::ApplyResistanceBuffModsMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline
1369{ ApplyModSignedFloatValue(positive ? static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE) + school : static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE) + + school, val, apply); }
@ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE
Definition: UpdateFields.h:157
@ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE
Definition: UpdateFields.h:158
void ApplyModSignedFloatValue(uint16 index, float val, bool apply)
Definition: Object.cpp:822

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, and UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE.

Referenced by AuraEffect::HandleAuraModResistance(), and AuraEffect::HandleAuraModResistanceExclusive().

◆ ApplyResistanceBuffModsPercentMod()

void Unit::ApplyResistanceBuffModsPercentMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline

◆ ApplySpellDispelImmunity()

void Unit::ApplySpellDispelImmunity ( SpellInfo const *  spellProto,
DispelType  type,
bool  apply 
)
13338{
13339 ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
13340
13341 if (apply && spellProto->HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
13342 {
13343 // Create dispel mask by dispel type
13344 uint32 dispelMask = SpellInfo::GetDispelMask(type);
13345 // Dispel all existing auras vs current dispel type
13347 for (AuraApplicationMap::iterator itr = auras.begin(); itr != auras.end();)
13348 {
13349 SpellInfo const* spell = itr->second->GetBase()->GetSpellInfo();
13350 if (spell->GetDispelMask() & dispelMask)
13351 {
13352 // Dispel aura
13353 RemoveAura(itr);
13354 }
13355 else
13356 ++itr;
13357 }
13358 }
13359}
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
Definition: SharedDefines.h:434
@ IMMUNITY_DISPEL
Definition: SharedDefines.h:1398
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition: Unit.cpp:13310
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition: Unit.h:639
AuraApplicationMap & GetAppliedAuras()
Definition: Unit.h:1266
uint32 GetDispelMask() const
Definition: SpellInfo.cpp:2040

References ApplySpellImmune(), GetAppliedAuras(), SpellInfo::GetDispelMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IMMUNITY_DISPEL, RemoveAura(), and SPELL_ATTR1_IMMUNITY_PURGES_EFFECT.

Referenced by AuraEffect::HandleAuraModDispelImmunity().

◆ ApplySpellImmune()

void Unit::ApplySpellImmune ( uint32  spellId,
uint32  op,
uint32  type,
bool  apply,
SpellImmuneBlockType  blockType = SPELL_BLOCK_TYPE_ALL 
)
13311{
13312 if (apply)
13313 {
13314 // xinef: immunities with spellId 0 are intended to be applied only once (script purposes mosty)
13315 if (spellId == 0 && std::find_if(m_spellImmune[op].begin(), m_spellImmune[op].end(), spellIdImmunityPredicate(type)) != m_spellImmune[op].end())
13316 return;
13317
13318 SpellImmune immune;
13319 immune.spellId = spellId;
13320 immune.type = type;
13321 immune.blockType = blockType;
13322 m_spellImmune[op].push_back(std::move(immune));
13323 }
13324 else
13325 {
13326 for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
13327 {
13328 if (itr->spellId == spellId && itr->type == type)
13329 {
13330 m_spellImmune[op].erase(itr);
13331 break;
13332 }
13333 }
13334 }
13335}
Definition: Unit.cpp:13301
Definition: SpellDefines.h:172
uint32 blockType
Definition: SpellDefines.h:177
uint32 spellId
Definition: SpellDefines.h:175
uint32 type
Definition: SpellDefines.h:176

References SpellImmune::blockType, m_spellImmune, SpellImmune::spellId, and SpellImmune::type.

Referenced by Vehicle::ApplyAllImmunities(), boss_kelidan_the_breaker::ApplyImmunities(), ApplyMechanicImmune(), ApplySpellDispelImmunity(), boss_amanitar::boss_amanitar(), boss_anubarak_trial::boss_anubarak_trialAI::boss_anubarak_trialAI(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_icehowl::boss_icehowlAI::boss_icehowlAI(), boss_sindragosa::boss_sindragosaAI::boss_sindragosaAI(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_void_reaver::boss_void_reaver(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDmgImmunity(), AuraEffect::HandleAuraModEffectImmunity(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleAuraModStateImmunity(), Aura::HandleAuraSpecificMods(), spell_q13007_iron_colossus::HandleDummy(), spell_love_in_air_perfume_immune::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_dk_anti_magic_shell_self::HandleEffectApply(), spell_dk_pet_scaling::HandleEffectApply(), spell_dru_treant_scaling::HandleEffectApply(), spell_pet_hit_expertise_scalling::HandleEffectApply(), spell_mage_pet_scaling::HandleEffectApply(), spell_pri_shadowfiend_scaling::HandleEffectApply(), spell_sha_feral_spirit_scaling::HandleEffectApply(), spell_sha_fire_elemental_scaling::HandleEffectApply(), spell_warl_infernal_scaling::HandleEffectApply(), spell_love_in_air_perfume_immune::HandleEffectRemove(), spell_dk_anti_magic_shell_self::HandleEffectRemove(), spell_gen_bg_preparation::HandleEffectRemove(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), npc_hyjal_jaina::hyjalJainaAI::hyjalJainaAI(), npc_pet_dk_army_of_the_dead::npc_pet_dk_army_of_the_deadAI::InitializeAI(), boss_hydross_the_unstable::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Player::LoadFromDB(), Creature::LoadSpellTemplateImmunity(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_target_dummy::npc_target_dummyAI::npc_target_dummyAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::npc_tournament_training_dummyAI(), npc_training_dummy::npc_training_dummyAI::npc_training_dummyAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::npc_ulduar_arachnopod_destroyerAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::npc_valkyr_shadowguardAI(), spell_yogg_saron_malady_of_the_mind_aura::OnApply(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_chesspiece::Reset(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_felblood_kaelthas::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::Reset(), npc_dark_iron_guzzler::Reset(), boss_mal_ganis::boss_mal_ganisAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_gluth::boss_gluthAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_auriaya::boss_auriayaAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_supremus::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), boss_supremus::SchedulePhase(), boss_hydross_the_unstable::SetForm(), boss_felblood_kaelthas::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), Creature::UpdateEntry(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ ApplyStatBuffMod()

void Unit::ApplyStatBuffMod ( Stats  stat,
float  val,
bool  apply 
)
inline
1376{ ApplyModSignedFloatValue((val > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), val, apply); }
@ UNIT_FIELD_POSSTAT0
Definition: UpdateFields.h:146
@ UNIT_FIELD_NEGSTAT0
Definition: UpdateFields.h:151

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), and AuraEffect::HandleAuraModStat().

◆ ApplyStatPercentBuffMod()

void Unit::ApplyStatPercentBuffMod ( Stats  stat,
float  val,
bool  apply 
)
15251{
15252 if (val == -100.0f) // prevent set var to zero
15253 val = -99.99f;
15254 float var = GetStat(stat) * val / 100.0f;
15255 ApplyModSignedFloatValue((var > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), var, apply);
15256}
float GetStat(Stats stat) const
Definition: Unit.h:771

References Object::ApplyModSignedFloatValue(), GetStat(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by AuraEffect::HandleModTotalPercentStat().

◆ ApplyTotalThreatModifier()

float Unit::ApplyTotalThreatModifier ( float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
14555{
14556 if (!HasAuraType(SPELL_AURA_MOD_THREAT) || fThreat < 0)
14557 return fThreat;
14558
14559 SpellSchools school = GetFirstSchoolInMask(schoolMask);
14560
14561 return fThreat * m_threatModifier[school];
14562}
@ SPELL_AURA_MOD_THREAT
Definition: SpellAuraDefines.h:73
SpellSchools
Definition: SharedDefines.h:282
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
Definition: SharedDefines.h:318
bool HasAuraType(AuraType auraType) const
Definition: Unit.cpp:5649

References GetFirstSchoolInMask(), HasAuraType(), m_threatModifier, and SPELL_AURA_MOD_THREAT.

Referenced by ThreatCalcHelper::calcThreat().

◆ Attack()

bool Unit::Attack ( Unit victim,
bool  meleeAttack 
)
Todo:
: Implement aggro range, detection range and assistance range templates
10208{
10209 if (!victim || victim == this)
10210 return false;
10211
10212 // dead units can neither attack nor be attacked
10213 if (!IsAlive() || !victim->IsAlive())
10214 return false;
10215
10216 // pussywizard: check map, world, phase >_> multithreading crash fix
10217 if (!IsInMap(victim) || !InSamePhase(victim))
10218 return false;
10219
10220 // player cannot attack in mount state
10221 if (IsPlayer() && IsMounted())
10222 return false;
10223
10224 // creatures cannot attack while evading
10225 Creature* creature = ToCreature();
10226 if (creature && creature->IsInEvadeMode())
10227 {
10228 return false;
10229 }
10230
10231 // creatures should not try to attack the player during polymorph
10232 if (creature && creature->IsPolymorphed())
10233 {
10234 return false;
10235 }
10236
10237 //if (HasUnitFlag(UNIT_FLAG_PACIFIED)) // pussywizard: why having this flag prevents from entering combat? it should just prevent melee attack
10238 // return false;
10239
10240 // nobody can attack GM in GM-mode
10241 if (victim->IsPlayer())
10242 {
10243 if (victim->ToPlayer()->IsGameMaster())
10244 return false;
10245 }
10246 else
10247 {
10248 if (victim->ToCreature()->IsEvadingAttacks())
10249 return false;
10250 }
10251
10252 // Unit with SPELL_AURA_SPIRIT_OF_REDEMPTION can not attack
10254 return false;
10255
10256 // remove SPELL_AURA_MOD_UNATTACKABLE at attack (in case non-interruptible spells stun aura applied also that not let attack)
10259
10260 if (m_attacking)
10261 {
10262 if (m_attacking == victim)
10263 {
10264 // switch to melee attack from ranged/magic
10265 if (meleeAttack)
10266 {
10268 {
10270 SendMeleeAttackStart(victim);
10271 return true;
10272 }
10273 }
10275 {
10277 SendMeleeAttackStop(victim);
10278 return true;
10279 }
10280 return false;
10281 }
10282
10283 // switch target
10284 InterruptSpell(CURRENT_MELEE_SPELL, true, true, true);
10285 if (!meleeAttack)
10287 }
10288
10289 if (m_attacking)
10291
10292 m_attacking = victim;
10294
10295 // Set our target
10296 SetTarget(victim->GetGUID());
10297
10298 if (meleeAttack)
10300
10301 // set position before any AI calls/assistance
10302 //if (GetTypeId() == TYPEID_UNIT)
10303 // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
10304 if (creature && !(IsControllableGuardian() && IsControlledByPlayer()))
10305 {
10306 // should not let player enter combat by right clicking target - doesn't helps
10307 SetInCombatWith(victim);
10308 if (victim->IsPlayer())
10309 victim->SetInCombatWith(this);
10310 AddThreat(victim, 0.0f);
10311
10313
10316 {
10317 creature->CallAssistance();
10318 }
10320
10322 }
10323
10324 // delay offhand weapon attack to next attack time
10327
10328 if (meleeAttack)
10329 SendMeleeAttackStart(victim);
10330
10331 return true;
10332}
@ UNIT_STATE_MELEE_ATTACKING
Definition: UnitDefines.h:150
#define ATTACK_DISPLAY_DELAY
Definition: Unit.h:624
@ CURRENT_MELEE_SPELL
Definition: Unit.h:537
@ CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE
Definition: CreatureData.h:71
@ UNIT_NPC_EMOTESTATE
Definition: UpdateFields.h:140
@ SPELL_AURA_SPIRIT_OF_REDEMPTION
Definition: SpellAuraDefines.h:239
@ SPELL_AURA_MOD_UNATTACKABLE
Definition: SpellAuraDefines.h:156
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD
Definition: IWorld.h:288
@ EMOTE_ONESHOT_NONE
Definition: SharedDefines.h:1894
@ AI_REACTION_HOSTILE
Definition: SharedDefines.h:3242
#define sWorld
Definition: World.h:444
void CallAssistance(Unit *target=nullptr)
Definition: Creature.cpp:2417
bool IsEvadingAttacks() const
Definition: Creature.h:132
void SetAssistanceTimer(uint32 value)
Definition: Creature.h:395
void SendAIReaction(AiReaction reactionType)
Definition: Creature.cpp:2405
bool IsInEvadeMode() const
Definition: Creature.h:131
bool InSamePhase(WorldObject const *obj) const
Definition: Object.h:445
bool IsInMap(WorldObject const *obj) const
Definition: Object.cpp:1285
bool IsGameMaster() const
Definition: Player.h:1157
void ClearUnitState(uint32 f)
Definition: Unit.h:739
bool IsPolymorphed() const
Definition: Unit.cpp:16655
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition: Unit.cpp:14566
void _removeAttacker(Unit *pAttacker)
Definition: Unit.h:702
bool haveOffhandWeapon() const
Definition: Unit.cpp:522
void _addAttacker(Unit *pAttacker)
Definition: Unit.h:698
void SetInCombatWith(Unit *enemy, uint32 duration=0)
Definition: Unit.cpp:13502
bool IsMounted() const
Definition: Unit.h:886
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition: Unit.cpp:3025
bool IsControllableGuardian() const
Definition: Unit.h:752
void SetUInt32Value(uint16 index, uint32 value)
Definition: Unit.cpp:21179
void SendMeleeAttackStop(Unit *victim=nullptr)
Definition: Unit.cpp:3037
bool IsControlledByPlayer() const
Definition: Unit.h:1170
virtual void SetTarget(ObjectGuid=ObjectGuid::Empty)=0

References _addAttacker(), _removeAttacker(), AddThreat(), AddUnitState(), AI_REACTION_HOSTILE, ATTACK_DISPLAY_DELAY, Creature::CallAssistance(), ClearUnitState(), CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE, CURRENT_MELEE_SPELL, EMOTE_ONESHOT_NONE, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), Object::GetGUID(), HasAuraType(), HasUnitState(), haveOffhandWeapon(), WorldObject::InSamePhase(), InterruptSpell(), IsAlive(), isAttackReady(), IsControllableGuardian(), IsControlledByPlayer(), Creature::IsEvadingAttacks(), Player::IsGameMaster(), Creature::IsInEvadeMode(), WorldObject::IsInMap(), IsMounted(), Object::IsPlayer(), IsPolymorphed(), m_attacking, OFF_ATTACK, RemoveAurasByType(), Creature::SendAIReaction(), SendMeleeAttackStart(), SendMeleeAttackStop(), Creature::SetAssistanceTimer(), setAttackTimer(), SetInCombatWith(), SetTarget(), SetUInt32Value(), SPELL_AURA_MOD_UNATTACKABLE, SPELL_AURA_SPIRIT_OF_REDEMPTION, sWorld, Object::ToCreature(), Object::ToPlayer(), UNIT_NPC_EMOTESTATE, and UNIT_STATE_MELEE_ATTACKING.

Referenced by UnitAI::AttackStart(), FollowerAI::AttackStart(), PossessedAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::AttackStart(), npc_gunship_mage::npc_gunship_mageAI::AttackStart(), npc_gunship_gunner::npc_gunship_gunnerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_illidan_stormrage::boss_illidan_stormrageAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), TurretAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), boss_alyson_antille::boss_alyson_antilleAI::AttackStart(), boss_gazakrothAI::AttackStart(), boss_slither::boss_slitherAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), boss_jormungarAI::AttackStart(), boss_four_horsemen::boss_four_horsemenAI::AttackStart(), boss_magus_telestra::boss_magus_telestraAI::AttackStart(), boss_kologarn::boss_kologarnAI::AttackStart(), boss_mimiron::boss_mimironAI::AttackStart(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_high_nethermancer_zerevor::AttackStart(), boss_lady_malande::AttackStart(), boss_the_lurker_below::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), boss_nazan::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), npc_pet_gen_gnomish_flame_turret::AttackStart(), UnitAI::AttackStartCaster(), ScriptedAI::AttackStartNoMove(), PetAI::DoAttack(), WorldSession::HandleAttackSwingOpcode(), spell_q12096_q12092_dummy::HandleDummy(), WorldSession::HandlePetActionHelper(), boss_halazzi::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), RemoveCharmedBy(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), Player::UpdateCharmedAI(), and npc_ranger_lilatha::WaypointReached().

◆ AttackerStateUpdate()

void Unit::AttackerStateUpdate ( Unit victim,
WeaponAttackType  attType = BASE_ATTACK,
bool  extra = false,
bool  ignoreCasting = false 
)
2530{
2532 {
2533 return;
2534 }
2535
2536 if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) && !extra && !ignoreCasting)
2537 {
2538 return;
2539 }
2540
2541 if (!victim->IsAlive())
2542 return;
2543
2544 if ((attType == BASE_ATTACK || attType == OFF_ATTACK) && !IsWithinLOSInMap(victim))
2545 return;
2546
2547 // CombatStart puts the target into stand state, so we need to cache sit state here to know if we should crit later
2548 const bool sittingVictim = victim->IsPlayer() && (victim->IsSitState() || victim->getStandState() == UNIT_STAND_STATE_SLEEP);
2549
2550 CombatStart(victim);
2552
2553 if (attType != BASE_ATTACK && attType != OFF_ATTACK)
2554 return; // ignore ranged case
2555
2556 if (!extra && _lastExtraAttackSpell)
2557 {
2559 }
2560
2561 bool meleeAttack = true;
2562
2563 // melee attack spell casted at main hand attack only - no normal melee dmg dealt
2564 if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra)
2565 {
2566 meleeAttack = false; // The melee attack is replaced by the melee spell
2567
2569 SpellCastResult castResult = meleeSpell->CheckCast(false);
2570 if (castResult != SPELL_CAST_OK)
2571 {
2572 meleeSpell->SendCastResult(castResult);
2573 meleeSpell->SendInterrupted(0);
2574
2575 meleeSpell->finish(false);
2576 meleeSpell->SetExecutedCurrently(false);
2577
2578 if (castResult == SPELL_FAILED_NO_POWER)
2579 {
2580 // Not enough rage, do a regular melee attack instead
2581 meleeAttack = true;
2582 }
2583 }
2584 else
2585 {
2586 meleeSpell->cast(true);
2587 }
2588 }
2589 if (meleeAttack)
2590 {
2591 // attack can be redirected to another target
2592 victim = GetMeleeHitRedirectTarget(victim);
2593 CalcDamageInfo damageInfo;
2594 CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim);
2595
2596 // Send log damage message to client
2597 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2598 {
2599 Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb);
2600 }
2601
2602 SendAttackStateUpdate(&damageInfo);
2603
2604 //TriggerAurasProcOnEvent(damageInfo);
2605
2606 _lastDamagedTargetGuid = victim->GetGUID();
2607
2608 DealMeleeDamage(&damageInfo, true);
2609
2610 DamageInfo dmgInfo(damageInfo);
2611 Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(),
2612 damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo);
2613
2614 if (IsPlayer())
2615 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2616 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2617 else
2618 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2619 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2620
2621 // Let the pet know we've started attacking someting. Handles melee attacks only
2622 // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode
2623 if (IsPlayer() && !m_Controlled.empty())
2624 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
2625 if (Unit* pet = *itr)
2626 if (pet->IsAlive() && pet->GetTypeId() == TYPEID_UNIT)
2627 pet->ToCreature()->AI()->OwnerAttacked(victim);
2628 }
2629}
#define MAX_ITEM_PROTO_DAMAGES
Definition: ItemTemplate.h:621
@ UNIT_STAND_STATE_SLEEP
Definition: UnitDefines.h:35
@ UNIT_STATE_CANNOT_AUTOATTACK
Definition: UnitDefines.h:193
@ UNIT_FLAG_PACIFIED
Definition: UnitDefines.h:246
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
Definition: SpellDefines.h:56
@ SPELL_FAILED_NO_POWER
Definition: SharedDefines.h:1034
bool IsWithinLOSInMap(WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
Definition: Object.cpp:1347
std::string ToString() const
Definition: ObjectGuid.cpp:47
std::string ToString() const
Definition: Position.cpp:51
Definition: Unit.h:330
Definition: Unit.h:463
uint32 procAttacker
Definition: Unit.h:480
uint32 procVictim
Definition: Unit.h:481
struct CalcDamageInfo::@261 damages[MAX_ITEM_PROTO_DAMAGES]
uint32 absorb
Definition: Unit.h:471
uint32 damage
Definition: Unit.h:470
uint32 procEx
Definition: Unit.h:482
Unit * attacker
Definition: Unit.h:464
Unit * target
Definition: Unit.h:465
WeaponAttackType attackType
Definition: Unit.h:479
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition: Unit.cpp:6423
void CombatStart(Unit *target, bool initialAggro=true)
Definition: Unit.cpp:13546
Unit * GetMeleeHitRedirectTarget(Unit *victim, SpellInfo const *spellInfo=nullptr)
Definition: Unit.cpp:10978
void CalculateMeleeDamage(Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
Definition: Unit.cpp:1448
static void ProcDamageAndSpell(Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition: Unit.cpp:6322
uint8 getStandState() const
Definition: Unit.h:878
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
Definition: Unit.cpp:1813
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition: Unit.cpp:787
void cast(bool skipCheck=false)
Definition: Spell.cpp:3781
void SetExecutedCurrently(bool yes)
Definition: Spell.h:561
void SendInterrupted(uint8 result)
Definition: Spell.cpp:5164
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition: Spell.cpp:4659
void finish(bool ok=true)
Definition: Spell.cpp:4472

References _lastDamagedTargetGuid, _lastExtraAttackSpell, CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::attackType, AURA_INTERRUPT_FLAG_MELEE_ATTACK, BASE_ATTACK, CalculateMeleeDamage(), Spell::cast(), Spell::CheckCast(), CombatStart(), CURRENT_MELEE_SPELL, CalcDamageInfo::damage, CalcDamageInfo::damages, DealDamageMods(), DealMeleeDamage(), Spell::finish(), DamageInfo::GetAbsorb(), DamageInfo::GetBlock(), DamageInfo::GetDamage(), Object::GetGUID(), GetMeleeHitRedirectTarget(), DamageInfo::GetResist(), getStandState(), HasUnitFlag(), HasUnitState(), IsAlive(), Object::IsPlayer(), IsSitState(), WorldObject::IsWithinLOSInMap(), LOG_DEBUG, m_Controlled, m_currentSpells, MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, CalcDamageInfo::procAttacker, ProcDamageAndSpell(), CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RemoveAurasWithInterruptFlags(), SendAttackStateUpdate(), Spell::SendCastResult(), Spell::SendInterrupted(), Spell::SetExecutedCurrently(), SPELL_CAST_OK, SPELL_FAILED_NO_POWER, CalcDamageInfo::target, ObjectGuid::ToString(), Position::ToString(), TYPEID_UNIT, UNIT_FLAG_PACIFIED, UNIT_STAND_STATE_SLEEP, and UNIT_STATE_CANNOT_AUTOATTACK.

Referenced by UnitAI::DoMeleeAttackIfReady(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), HandleProcExtraAttackFor(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Player::Update(), boss_dred::boss_dredAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and boss_the_lurker_below::UpdateAI().

◆ AttackStop()

bool Unit::AttackStop ( )
10335{
10336 if (!m_attacking)
10337 return false;
10338
10339 Unit* victim = m_attacking;
10340
10342 m_attacking = nullptr;
10343
10344 // Clear our target
10346
10348
10350
10351 // reset only at real combat stop
10352 if (Creature* creature = ToCreature())
10353 {
10354 creature->SetNoCallAssistance(false);
10355
10356 if (creature->HasSearchedAssistance())
10357 {
10358 creature->SetNoSearchAssistance(false);
10359 }
10360 }
10361
10362 SendMeleeAttackStop(victim);
10363
10364 return true;
10365}

References _removeAttacker(), ClearUnitState(), CURRENT_MELEE_SPELL, ObjectGuid::Empty, InterruptSpell(), m_attacking, SendMeleeAttackStop(), SetTarget(), Object::ToCreature(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by PetAI::_stopAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CombatStop(), boss_jedoga_shadowseeker::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_thekal::DamageTaken(), boss_viscidus::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), ScriptedAI::DoStopAttack(), Player::DuelComplete(), Spell::EffectSanctuary(), SmartAI::EnterEvadeMode(), Spell::finish(), WorldSession::HandleAttackStopOpcode(), spell_hun_scatter_shot::HandleDummy(), spell_mc_play_dead_aura::HandleEffectApply(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetStopAttack(), RotateMovementGenerator::Initialize(), PetAI::KilledUnit(), MotionMaster::MoveSeekAssistance(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), PetSpellFail(), RemoveCharmedBy(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_heigan::boss_heiganAI::StartFightPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), StopAttackFaction(), StopAttackingInvalidTarget(), boss_ouro::Submerge(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ BuildAuraStateUpdateForTarget()

uint32 Unit::BuildAuraStateUpdateForTarget ( Unit target) const
10463{
10465 for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.begin(); itr != m_auraStateAuras.end(); ++itr)
10466 if ((1 << (itr->first - 1)) & PER_CASTER_AURA_STATE_MASK)
10467 if (itr->second->GetBase()->GetCasterGUID() == target->GetGUID())
10468 auraStates |= (1 << (itr->first - 1));
10469
10470 return auraStates;
10471}
uint32 GetUInt32Value(uint16 index) const
Definition: Object.cpp:305

References Object::GetGUID(), Object::GetUInt32Value(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, and UNIT_FIELD_AURASTATE.

Referenced by PatchValuesUpdate().

◆ BuildCooldownPacket() [1/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
PacketCooldowns const &  cooldowns 
)
20874{
20875 data.Initialize(SMSG_SPELL_COOLDOWN, 8 + 1 + (4 + 4) * cooldowns.size());
20876 data << GetGUID();
20877 data << uint8(flags);
20878 for (std::unordered_map<uint32, uint32>::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
20879 {
20880 data << uint32(itr->first);
20881 data << uint32(itr->second);
20882 }
20883}
@ SMSG_SPELL_COOLDOWN
Definition: Opcodes.h:338
void Initialize(uint16 opcode, std::size_t newres=200)
Definition: WorldPacket.h:69

References Object::GetGUID(), WorldPacket::Initialize(), and SMSG_SPELL_COOLDOWN.

◆ BuildCooldownPacket() [2/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
uint32  spellId,
uint32  cooldown 
)

◆ BuildHeartBeatMsg()

void Unit::BuildHeartBeatMsg ( WorldPacket data) const
2074{
2075 data->Initialize(MSG_MOVE_HEARTBEAT, 32);
2076 *data << GetPackGUID();
2077 BuildMovementPacket(data);
2078}
@ MSG_MOVE_HEARTBEAT
Definition: Opcodes.h:268
void BuildMovementPacket(ByteBuffer *data) const
Definition: Unit.cpp:19805

References BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), and MSG_MOVE_HEARTBEAT.

Referenced by boss_volkhan::boss_volkhanAI::MovementInform(), and SendMovementFlagUpdate().

◆ BuildMovementPacket()

void Unit::BuildMovementPacket ( ByteBuffer data) const
19806{
19807 *data << uint32(GetUnitMovementFlags()); // movement flags
19808 *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
19809 *data << uint32(GameTime::GetGameTimeMS().count()); // time / counter
19810 *data << GetPositionX();
19811 *data << GetPositionY();
19812 *data << GetPositionZ();
19813 *data << GetOrientation();
19814
19815 // 0x00000200
19817 {
19818 if (m_vehicle)
19819 *data << m_vehicle->GetBase()->GetPackGUID();
19820 else if (GetTransport())
19821 *data << GetTransport()->GetPackGUID();
19822 else
19823 *data << (uint8)0;
19824
19825 *data << float (GetTransOffsetX());
19826 *data << float (GetTransOffsetY());
19827 *data << float (GetTransOffsetZ());
19828 *data << float (GetTransOffsetO());
19829 *data << uint32(GetTransTime());
19830 *data << uint8 (GetTransSeat());
19831
19834 }
19835
19836 // 0x02200000
19839 *data << (float)m_movementInfo.pitch;
19840
19841 *data << (uint32)m_movementInfo.fallTime;
19842
19843 // 0x00001000
19845 {
19846 *data << (float)m_movementInfo.jump.zspeed;
19847 *data << (float)m_movementInfo.jump.sinAngle;
19848 *data << (float)m_movementInfo.jump.cosAngle;
19849 *data << (float)m_movementInfo.jump.xyspeed;
19850 }
19851
19852 // 0x04000000
19854 *data << (float)m_movementInfo.splineElevation;
19855}
@ MOVEMENTFLAG_ONTRANSPORT
Definition: UnitDefines.h:353
@ MOVEMENTFLAG_FLYING
Definition: UnitDefines.h:369
@ MOVEMENTFLAG_FALLING
Definition: UnitDefines.h:356
@ MOVEMENTFLAG_SWIMMING
Definition: UnitDefines.h:365
@ MOVEMENTFLAG_SPLINE_ELEVATION
Definition: UnitDefines.h:370
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition: UnitDefines.h:405
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
Definition: UnitDefines.h:410
struct MovementInfo::JumpInfo jump
uint32 fallTime
Definition: Object.h:305
struct MovementInfo::TransportInfo transport
float splineElevation
Definition: Object.h:319
float pitch
Definition: Object.h:302
uint32 time2
Definition: Object.h:298
float cosAngle
Definition: Object.h:315
float xyspeed
Definition: Object.h:315
float zspeed
Definition: Object.h:315
float sinAngle
Definition: Object.h:315
float GetTransOffsetX() const
Definition: Object.h:598
float GetTransOffsetY() const
Definition: Object.h:599
float GetTransOffsetZ() const
Definition: Object.h:600
uint32 GetTransTime() const
Definition: Object.h:602
Transport * GetTransport() const
Definition: Object.h:597
float GetTransOffsetO() const
Definition: Object.h:601
uint32 GetUnitMovementFlags() const
Definition: Unit.h:1617
uint16 GetExtraUnitMovementFlags() const
Definition: Unit.h:1623

References MovementInfo::JumpInfo::cosAngle, MovementInfo::fallTime, MovementInfo::flags2, Vehicle::GetBase(), GetExtraUnitMovementFlags(), GameTime::GetGameTimeMS(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), WorldObject::GetTransSeat(), WorldObject::GetTransTime(), GetUnitMovementFlags(), MovementInfo::jump, WorldObject::m_movementInfo, m_vehicle, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING, MOVEMENTFLAG2_INTERPOLATED_MOVEMENT, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FLYING, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_SWIMMING, MovementInfo::pitch, MovementInfo::JumpInfo::sinAngle, MovementInfo::splineElevation, MovementInfo::TransportInfo::time2, MovementInfo::transport, MovementInfo::JumpInfo::xyspeed, and MovementInfo::JumpInfo::zspeed.

Referenced by BuildHeartBeatMsg(), Object::BuildMovementUpdate(), WorldSession::HandleMoveKnockBackAck(), Player::SendTeleportAckPacket(), SendTeleportPacket(), Player::SetCanFly(), Creature::SetCanFly(), Creature::SetDisableGravity(), Player::SetDisableGravity(), Player::SetFeatherFall(), Creature::SetFeatherFall(), Player::SetHover(), SetSpeed(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ BuildValuesUpdate()

void Unit::BuildValuesUpdate ( uint8  updateType,
ByteBuffer data,
Player target 
)
overrideprotectedvirtual

Reimplemented from Object.

20590{
20591 if (!target)
20592 return;
20593
20595 uint32 visibleFlag = UF_FLAG_PUBLIC;
20596
20597 if (target == this)
20598 visibleFlag |= UF_FLAG_PRIVATE;
20599
20601 if (GetOwnerGUID() == target->GetGUID())
20602 visibleFlag |= UF_FLAG_OWNER;
20603
20606 visibleFlag |= UF_FLAG_SPECIAL_INFO;
20607
20608 if (plr && plr->IsInSameRaidWith(target))
20609 visibleFlag |= UF_FLAG_PARTY_MEMBER;
20610
20611 uint64 cacheKey = static_cast<uint64>(visibleFlag) << 8 | updateType;
20612
20613 auto cacheIt = _valuesUpdateCache.find(cacheKey);
20614 if (cacheIt != _valuesUpdateCache.end())
20615 {
20616 int32 cachePos = static_cast<int32>(data->wpos());
20617 data->append(cacheIt->second.buffer);
20618
20619 BuildValuesCachePosPointers dataAdjustedPos = cacheIt->second.posPointers;
20620 if (cachePos)
20621 dataAdjustedPos.ApplyOffset(cachePos);
20622
20623 PatchValuesUpdate(*data, dataAdjustedPos, target);
20624
20625 return;
20626 }
20627
20628 BuildValuesCachedBuffer cacheValue(500);
20629
20630 ByteBuffer fieldBuffer(400);
20631
20632 UpdateMask updateMask;
20633 updateMask.SetCount(m_valuesCount);
20634
20635 for (uint16 index = 0; index < m_valuesCount; ++index)
20636 {
20637 if (_fieldNotifyFlags & flags[index] ||
20638 ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
20639 ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
20641 {
20642 updateMask.SetBit(index);
20643
20644 if (index == UNIT_NPC_FLAGS)
20645 {
20646 cacheValue.posPointers.UnitNPCFlagsPos = int32(fieldBuffer.wpos());
20647 fieldBuffer << m_uint32Values[UNIT_NPC_FLAGS];
20648 }
20649 else if (index == UNIT_FIELD_AURASTATE)
20650 {
20651 cacheValue.posPointers.UnitFieldAuraStatePos = int32(fieldBuffer.wpos());
20652 fieldBuffer << uint32(0); // Fill in later.
20653 }
20654 // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
20655 else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
20656 {
20657 // convert from float to uint32 and send
20658 fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
20659 }
20660 // there are some float values which may be negative or can't get negative due to other checks
20661 else if ((index >= UNIT_FIELD_NEGSTAT0 && index <= UNIT_FIELD_NEGSTAT4) ||
20664 (index >= UNIT_FIELD_POSSTAT0 && index <= UNIT_FIELD_POSSTAT4))
20665 {
20666 fieldBuffer << uint32(m_floatValues[index]);
20667 }
20668 // Gamemasters should be always able to select units - remove not selectable flag
20669 else if (index == UNIT_FIELD_FLAGS)
20670 {
20671 cacheValue.posPointers.UnitFieldFlagsPos = int32(fieldBuffer.wpos());
20672 fieldBuffer << m_uint32Values[UNIT_FIELD_FLAGS];
20673 }
20674 // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
20675 else if (index == UNIT_FIELD_DISPLAYID)
20676 {
20677 cacheValue.posPointers.UnitFieldDisplayPos = int32(fieldBuffer.wpos());
20678 fieldBuffer << m_uint32Values[UNIT_FIELD_DISPLAYID];
20679 }
20680 else if (index == UNIT_DYNAMIC_FLAGS)
20681 {
20682 cacheValue.posPointers.UnitDynamicFlagsPos = int32(fieldBuffer.wpos());
20684 fieldBuffer << dynamicFlags;
20685 }
20686 else if (index == UNIT_FIELD_BYTES_2)
20687 {
20688 cacheValue.posPointers.UnitFieldBytes2Pos = int32(fieldBuffer.wpos());
20689 fieldBuffer << m_uint32Values[index];
20690 }
20691 else if (index == UNIT_FIELD_FACTIONTEMPLATE)
20692 {
20693 cacheValue.posPointers.UnitFieldFactionTemplatePos = int32(fieldBuffer.wpos());
20694 fieldBuffer << m_uint32Values[index];
20695 }
20696 else
20697 {
20698 if (sScriptMgr->ShouldTrackValuesUpdatePosByIndex(this, updateType, index))
20699 cacheValue.posPointers.other[index] = static_cast<uint32>(fieldBuffer.wpos());
20700
20701 // send in current format (float as float, uint32 as uint32)
20702 fieldBuffer << m_uint32Values[index];
20703 }
20704 }
20705 }
20706
20707 cacheValue.buffer << uint8(updateMask.GetBlockCount());
20708 updateMask.AppendToPacket(&cacheValue.buffer);
20709 int32 fieldBufferPos = static_cast<int32>(cacheValue.buffer.wpos());
20710 cacheValue.buffer.append(fieldBuffer);
20711 cacheValue.posPointers.ApplyOffset(fieldBufferPos);
20712
20713 int32 cachePos = static_cast<int32>(data->wpos());
20714 data->append(cacheValue.buffer);
20715
20716 BuildValuesCachePosPointers dataAdjustedPos = cacheValue.posPointers;
20717 if (cachePos)
20718 dataAdjustedPos.ApplyOffset(cachePos);
20719
20720 PatchValuesUpdate(*data, dataAdjustedPos, target);
20721
20722 _valuesUpdateCache.insert(std::pair<uint64, BuildValuesCachedBuffer>(cacheKey, std::move(cacheValue)));
20723}
std::uint64_t uint64
Definition: Define.h:106
uint32 UnitUpdateFieldFlags[PLAYER_END]
Definition: UpdateFieldFlags.cpp:162
@ UF_FLAG_SPECIAL_INFO
Definition: UpdateFieldFlags.h:32
@ UF_FLAG_PUBLIC
Definition: UpdateFieldFlags.h:27
@ UF_FLAG_OWNER
Definition: UpdateFieldFlags.h:29
@ UF_FLAG_PRIVATE
Definition: UpdateFieldFlags.h:28
@ UF_FLAG_PARTY_MEMBER
Definition: UpdateFieldFlags.h:33
@ UNIT_NPC_FLAGS
Definition: UpdateFields.h:139
@ UNIT_FIELD_RANGEDATTACKTIME
Definition: UpdateFields.h:121
@ UNIT_FIELD_DISPLAYID
Definition: UpdateFields.h:124
@ UNIT_FIELD_FACTIONTEMPLATE
Definition: UpdateFields.h:115
@ UNIT_FIELD_POSSTAT4
Definition: UpdateFields.h:150
@ UNIT_FIELD_NEGSTAT4
Definition: UpdateFields.h:155
@ UNIT_FIELD_FLAGS
Definition: UpdateFields.h:117
@ UNIT_DYNAMIC_FLAGS
Definition: UpdateFields.h:136
@ UPDATETYPE_VALUES
Definition: UpdateData.h:28
@ SPELL_AURA_EMPATHY
Definition: SpellAuraDefines.h:184
@ UNIT_DYNFLAG_SPECIALINFO
Definition: SharedDefines.h:3125
@ UNIT_DYNFLAG_TAPPED_BY_PLAYER
Definition: SharedDefines.h:3124
@ UNIT_DYNFLAG_TAPPED
Definition: SharedDefines.h:3123
uint16 _fieldNotifyFlags
Definition: Object.h:254
bool HasDynamicFlag(uint32 flag) const
Definition: Object.h:119
UpdateMask _changesMask
Definition: Object.h:250
uint32 * m_uint32Values
Definition: Object.h:246
uint16 m_valuesCount
Definition: Object.h:252
float * m_floatValues
Definition: Object.h:247
Definition: UpdateMask.h:25
uint32 GetBlockCount() const
Definition: UpdateMask.h:62
bool GetBit(uint32 index) const
Definition: UpdateMask.h:47
void SetCount(uint32 valuesCount)
Definition: UpdateMask.h:65
void SetBit(uint32 index)
Definition: UpdateMask.h:45
void AppendToPacket(ByteBuffer *data)
Definition: UpdateMask.h:49
bool IsInSameRaidWith(Player const *p) const
Definition: Player.h:1862
ValuesUpdateCache _valuesUpdateCache
Definition: Unit.h:1946
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition: Unit.cpp:10542
bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const
Definition: Unit.cpp:5654
ObjectGuid GetOwnerGUID() const
Definition: Unit.h:1156
void PatchValuesUpdate(ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
Definition: Unit.cpp:20725
Definition: UnitUtils.h:65
void ApplyOffset(uint32 offset)
Definition: UnitUtils.h:70
Definition: UnitUtils.h:110
Definition: ByteBuffer.h:70
void append(T value)
Definition: ByteBuffer.h:129
std::size_t wpos() const
Definition: ByteBuffer.h:330

References Object::_changesMask, Object::_fieldNotifyFlags, _valuesUpdateCache, ByteBuffer::append(), UpdateMask::AppendToPacket(), BuildValuesCachePosPointers::ApplyOffset(), BuildValuesCachedBuffer::buffer, UpdateMask::GetBit(), UpdateMask::GetBlockCount(), GetCharmerOrOwnerPlayerOrPlayerItself(), Object::GetGUID(), GetOwnerGUID(), HasAuraTypeWithCaster(), Object::HasDynamicFlag(), Object::HasFlag(), Player::IsInSameRaidWith(), Object::m_floatValues, Object::m_uint32Values, Object::m_valuesCount, BuildValuesCachePosPointers::other, PatchValuesUpdate(), PER_CASTER_AURA_STATE_MASK, BuildValuesCachedBuffer::posPointers, UpdateMask::SetBit(), UpdateMask::SetCount(), SPELL_AURA_EMPATHY, sScriptMgr, UF_FLAG_OWNER, UF_FLAG_PARTY_MEMBER, UF_FLAG_PRIVATE, UF_FLAG_PUBLIC, UF_FLAG_SPECIAL_INFO, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FACTIONTEMPLATE, UNIT_FIELD_FLAGS, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_NEGSTAT4, UNIT_FIELD_POSSTAT0, UNIT_FIELD_POSSTAT4, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, BuildValuesCachePosPointers::UnitNPCFlagsPos, UnitUpdateFieldFlags, UPDATETYPE_VALUES, and ByteBuffer::wpos().

◆ CalcAbsorbResist()

void Unit::CalcAbsorbResist ( DamageInfo dmgInfo,
bool  Splited = false 
)
static
2112{
2113 Unit* victim = dmgInfo.GetVictim();
2114 Unit* attacker = dmgInfo.GetAttacker();
2115 uint32 damage = dmgInfo.GetDamage();
2116 SpellSchoolMask schoolMask = dmgInfo.GetSchoolMask();
2117 SpellInfo const* spellInfo = dmgInfo.GetSpellInfo();
2118
2119 if (!victim || !victim->IsAlive() || !damage)
2120 return;
2121
2122 // Magic damage, check for resists
2123 // Ignore spells that cant be resisted
2124 // Xinef: holy resistance exists for npcs
2125 if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->GetTypeId() == TYPEID_UNIT) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))))
2126 {
2127 float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim);
2128
2129 float discreteResistProbability[11];
2130 for (uint32 i = 0; i < 11; ++i)
2131 {
2132 discreteResistProbability[i] = 0.5f - 2.5f * std::fabs(0.1f * i - averageResist);
2133 if (discreteResistProbability[i] < 0.0f)
2134 discreteResistProbability[i] = 0.0f;
2135 }
2136
2137 if (averageResist <= 0.1f)
2138 {
2139 discreteResistProbability[0] = 1.0f - 7.5f * averageResist;
2140 discreteResistProbability[1] = 5.0f * averageResist;
2141 discreteResistProbability[2] = 2.5f * averageResist;
2142 }
2143
2144 float r = float(rand_norm());
2145 uint32 i = 0;
2146 float probabilitySum = discreteResistProbability[0];
2147
2148 while (r >= probabilitySum && i < 10)
2149 probabilitySum += discreteResistProbability[++i];
2150
2151 float damageResisted = float(damage * i / 10);
2152
2153 if (damageResisted) // if equal to 0, checking these is pointless
2154 {
2155 if (attacker)
2156 {
2158 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2159 if (((*j)->GetMiscValue() & schoolMask) && (*j)->IsAffectedOnSpell(spellInfo))
2160 AddPct(damageResisted, -(*j)->GetAmount());
2161
2163 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2164 if ((*j)->GetMiscValue() & schoolMask)
2165 AddPct(damageResisted, -(*j)->GetAmount());
2166 }
2167
2168 // pussywizard:
2169 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC))
2170 {
2171 uint32 damageAfterArmor = Unit::CalcArmorReducedDamage(attacker, victim, damage, spellInfo, 0, BASE_ATTACK);
2172 uint32 armorReduction = damage - damageAfterArmor;
2173 if (armorReduction < damageResisted) // pick the lower one, the weakest resistance counts
2174 damageResisted = armorReduction;
2175 }
2176 }
2177
2178 dmgInfo.ResistDamage(uint32(damageResisted));
2179 }
2180
2181 // Ignore Absorption Auras
2182 float auraAbsorbMod = 0;
2183 if (attacker)
2184 {
2186 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasA.begin(); itr != AbsIgnoreAurasA.end(); ++itr)
2187 {
2188 if (!((*itr)->GetMiscValue() & schoolMask))
2189 continue;
2190
2191 if ((*itr)->GetAmount() > auraAbsorbMod)
2192 auraAbsorbMod = float((*itr)->GetAmount());
2193 }
2194
2196 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasB.begin(); itr != AbsIgnoreAurasB.end(); ++itr)
2197 {
2198 if (!((*itr)->GetMiscValue() & schoolMask))
2199 continue;
2200
2201 if (((*itr)->GetAmount() > auraAbsorbMod) && (*itr)->IsAffectedOnSpell(spellInfo))
2202 auraAbsorbMod = float((*itr)->GetAmount());
2203 }
2204 RoundToInterval(auraAbsorbMod, 0.0f, 100.0f);
2205 }
2206
2207 // We're going to call functions which can modify content of the list during iteration over it's elements
2208 // Let's copy the list so we can prevent iterator invalidation
2210 vSchoolAbsorbCopy.sort(Acore::AbsorbAuraOrderPred());
2211
2212 // absorb without mana cost
2213 for (AuraEffectList::iterator itr = vSchoolAbsorbCopy.begin(); (itr != vSchoolAbsorbCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2214 {
2215 AuraEffect* absorbAurEff = *itr;
2216 // Check if aura was removed during iteration - we don't need to work on such auras
2217 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2218 if (!aurApp)
2219 continue;
2220 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2221 continue;
2222
2223 // get amount which can be still absorbed by the aura
2224 int32 currentAbsorb = absorbAurEff->GetAmount();
2225 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2226 if (currentAbsorb < 0)
2227 currentAbsorb = 0;
2228
2229 uint32 tempAbsorb = uint32(currentAbsorb);
2230
2231 bool defaultPrevented = false;
2232
2233 absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2234 currentAbsorb = tempAbsorb;
2235
2236 if (defaultPrevented)
2237 continue;
2238
2239 // absorb must be smaller than the damage itself
2240 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2241
2242 // xinef: do this after absorb is rounded to damage...
2243 AddPct(currentAbsorb, -auraAbsorbMod);
2244
2245 dmgInfo.AbsorbDamage(currentAbsorb);
2246
2247 tempAbsorb = currentAbsorb;
2248 absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2249
2250 // Check if our aura is using amount to count damage
2251 if (absorbAurEff->GetAmount() >= 0)
2252 {
2253 // Reduce shield amount
2254 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2255 // Aura cannot absorb anything more - remove it
2256 if (absorbAurEff->GetAmount() <= 0)
2257 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2258 }
2259 }
2260
2261 // absorb by mana cost
2263 for (AuraEffectList::const_iterator itr = vManaShieldCopy.begin(); (itr != vManaShieldCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2264 {
2265 AuraEffect* absorbAurEff = *itr;
2266 // Check if aura was removed during iteration - we don't need to work on such auras
2267 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2268 if (!aurApp)
2269 continue;
2270 // check damage school mask
2271 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2272 continue;
2273
2274 // get amount which can be still absorbed by the aura
2275 int32 currentAbsorb = absorbAurEff->GetAmount();
2276 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2277 if (currentAbsorb < 0)
2278 currentAbsorb = 0;
2279
2280 uint32 tempAbsorb = currentAbsorb;
2281
2282 bool defaultPrevented = false;
2283
2284 absorbAurEff->GetBase()->CallScriptEffectManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2285 currentAbsorb = tempAbsorb;
2286
2287 if (defaultPrevented)
2288 continue;
2289
2290 // absorb must be smaller than the damage itself
2291 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2292
2293 // xinef: do this after absorb is rounded to damage...
2294 AddPct(currentAbsorb, -auraAbsorbMod);
2295
2296 int32 manaReduction = currentAbsorb;
2297
2298 // lower absorb amount by talents
2299 if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))
2300 manaReduction = int32(float(manaReduction) * manaMultiplier);
2301
2302 int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);
2303
2304 // take case when mana has ended up into account
2305 currentAbsorb = currentAbsorb ? int32(float(currentAbsorb) * (float(manaTaken) / float(manaReduction))) : 0;
2306
2307 dmgInfo.AbsorbDamage(currentAbsorb);
2308
2309 tempAbsorb = currentAbsorb;
2310 absorbAurEff->GetBase()->CallScriptEffectAfterManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2311
2312 // Check if our aura is using amount to count damage
2313 if (absorbAurEff->GetAmount() >= 0)
2314 {
2315 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2316 if ((absorbAurEff->GetAmount() <= 0))
2317 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2318 }
2319 }
2320
2321 // split damage auras - only when not damaging self
2322 // Xinef: not true - Warlock Hellfire
2323 if (/*victim != attacker &&*/ !Splited)
2324 {
2325 // We're going to call functions which can modify content of the list during iteration over it's elements
2326 // Let's copy the list so we can prevent iterator invalidation
2327 AuraEffectList vSplitDamageFlatCopy(victim->GetAuraEffectsByType(SPELL_AURA_SPLIT_DAMAGE_FLAT)); // Not used by any spell
2328 for (AuraEffectList::iterator itr = vSplitDamageFlatCopy.begin(); (itr != vSplitDamageFlatCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2329 {
2330 // Check if aura was removed during iteration - we don't need to work on such auras
2331 if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
2332 continue;
2333 // check damage school mask
2334 if (!((*itr)->GetMiscValue() & schoolMask))
2335 continue;
2336
2337 // Damage can be splitted only if aura has an alive caster
2338 Unit* caster = (*itr)->GetCaster();
2339 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2340 continue;
2341
2342 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2343 // Ignore LOS attribute is only used for the cast portion of the spell
2344 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2345 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2346 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2347 continue;
2348
2349 int32 splitDamage = (*itr)->GetAmount();
2350
2351 // absorb must be smaller than the damage itself
2352 splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage()));
2353
2354 dmgInfo.AbsorbDamage(splitDamage);
2355
2356 uint32 splitted = splitDamage;
2357 uint32 splitted_absorb = 0;
2358 uint32 splitted_resist = 0;
2359
2360 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2361 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, schoolMask, dmgInfo.GetDamageType());
2362 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2363 {
2364 procEx |= PROC_EX_IMMUNE;
2365 splittedDmgInfo.AbsorbDamage(splitted);
2366 }
2367 else
2368 {
2369 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2370 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2371 }
2372
2373 splitted_absorb = splittedDmgInfo.GetAbsorb();
2374 splitted_resist = splittedDmgInfo.GetResist();
2375 splitted = splittedDmgInfo.GetDamage();
2376
2377 // create procs
2378 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2379 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted, nullptr, -1, nullptr, &splittedDmgInfo);
2380
2381 if (attacker)
2382 {
2383 attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo(), splitted, schoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2384 }
2385
2386 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2387 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
2388 }
2389
2390 // We're going to call functions which can modify content of the list during iteration over it's elements
2391 // Let's copy the list so we can prevent iterator invalidation
2393 for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(), next; (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2394 {
2395 // Check if aura was removed during iteration - we don't need to work on such auras
2396 AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2397 if (!aurApp)
2398 continue;
2399
2400 // check damage school mask
2401 if (!((*itr)->GetMiscValue() & schoolMask))
2402 continue;
2403
2404 // Damage can be splitted only if aura has an alive caster
2405 Unit* caster = (*itr)->GetCaster();
2406 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2407 continue;
2408
2409 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2410 // Ignore LOS attribute is only used for the cast portion of the spell
2411 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2412 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2413 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2414 continue;
2415
2416 uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount());
2417 SpellSchoolMask splitSchoolMask = schoolMask;
2418
2419 (*itr)->GetBase()->CallScriptEffectSplitHandlers(*itr, aurApp, dmgInfo, splitDamage);
2420
2421 // absorb must be smaller than the damage itself
2422 splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage()));
2423
2424 // Roar of Sacrifice, dont absorb it
2425 if (splitSpellInfo->Id != 53480)
2426 dmgInfo.AbsorbDamage(splitDamage);
2427 else
2428 splitSchoolMask = SPELL_SCHOOL_MASK_NATURE;
2429
2430 uint32 splitted = splitDamage;
2431 uint32 splitted_absorb = 0;
2432 uint32 splitted_resist = 0;
2433
2434 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2435 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, splitSchoolMask, dmgInfo.GetDamageType());
2436 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2437 {
2438 procEx |= PROC_EX_IMMUNE;
2439 splittedDmgInfo.AbsorbDamage(splitted);
2440 }
2441 else
2442 {
2443 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2444 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2445 }
2446
2447 splitted_absorb = splittedDmgInfo.GetAbsorb();
2448 splitted_resist = splittedDmgInfo.GetResist();
2449 splitted = splittedDmgInfo.GetDamage();
2450
2451 // create procs
2452 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2453 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted);
2454
2455 if (attacker)
2456 {
2457 attacker->SendSpellNonMeleeDamageLog(caster, splitSpellInfo, splitted, splitSchoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2458 }
2459
2460 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2461 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false);
2462 }
2463 }
2464}
T AddPct(T &base, U pct)
Definition: Util.h:67
T RoundToInterval(T &num, T floor, T ceil)
Definition: Util.h:79
T CalculatePct(T base, U pct)
Definition: Util.h:61
double rand_norm()
Definition: Random.cpp:77
void createProcFlags(SpellInfo const *spellInfo, WeaponAttackType attackType, bool positive, uint32 &procAttacker, uint32 &procVictim)
Definition: Unit.cpp:15834
@ DIRECT_DAMAGE
Definition: Unit.h:248
@ MELEE_HIT_NORMAL
Definition: Unit.h:286
@ SPELL_AURA_MANA_SHIELD
Definition: SpellAuraDefines.h:160
@ SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL
Definition: SpellAuraDefines.h:257
@ SPELL_AURA_MOD_IGNORE_TARGET_RESIST
Definition: SpellAuraDefines.h:332
@ SPELL_AURA_SPLIT_DAMAGE_FLAT
Definition: SpellAuraDefines.h:216
@ SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL
Definition: SpellAuraDefines.h:258
@ SPELL_AURA_SPLIT_DAMAGE_PCT
Definition: SpellAuraDefines.h:144
@ SPELL_AURA_SCHOOL_ABSORB
Definition: SpellAuraDefines.h:132
@ SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST
Definition: SpellAuraDefines.h:333
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition: SpellAuraDefines.h:394
@ SPELL_ATTR0_CU_BINARY_SPELL
Definition: SpellInfo.h:196
@ SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC
Definition: SpellInfo.h:199
@ PROC_EX_NORMAL_HIT
Definition: SpellMgr.h:194
@ PROC_EX_IMMUNE
Definition: SpellMgr.h:202
@ POWER_MANA
Definition: SharedDefines.h:269
@ SPELL_ATTR4_NO_CAST_LOG
Definition: SharedDefines.h:530
SpellSchoolMask
Definition: SharedDefines.h:295
@ SPELL_SCHOOL_MASK_NORMAL
Definition: SharedDefines.h:297
@ SPELL_SCHOOL_MASK_NATURE
Definition: SharedDefines.h:300
@ SPELL_SCHOOL_MASK_HOLY
Definition: SharedDefines.h:298
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1316
Definition: Unit.h:315
void ResistDamage(uint32 amount)
Definition: Unit.cpp:159
void AbsorbDamage(uint32 amount)
Definition: Unit.cpp:152
Unit * GetVictim() const
Definition: Unit.h:359
Unit * GetAttacker() const
Definition: Unit.h:358
SpellInfo const * GetSpellInfo() const
Definition: Unit.h:360
DamageEffectType GetDamageType() const
Definition: Unit.h:362
SpellSchoolMask GetSchoolMask() const
Definition: Unit.h:361
uint32 GetDamage() const
Definition: Unit.h:364
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition: Unit.cpp:14064
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1309
static uint32 CalcArmorReducedDamage(Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
Definition: Unit.cpp:1995
static float GetEffectiveResistChance(Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
Definition: Unit.cpp:2077
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition: Unit.cpp:6254
void ProcDamageAndSpellFor(bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition: Unit.cpp:15968
std::list< AuraEffect * > AuraEffectList
Definition: Unit.h:646
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12822
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition: Unit.cpp:2111
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition: Unit.cpp:797
Definition: SpellAuraEffects.h:39
SpellInfo const * GetSpellInfo() const
Definition: SpellAuraEffects.h:54
void SetAmount(int32 amount)
Definition: SpellAuraEffects.h:66
Unit * GetCaster() const
Definition: SpellAuraEffects.h:47
int32 GetMiscValue() const
Definition: SpellAuraEffects.cpp:442
Aura * GetBase() const
Definition: SpellAuraEffects.h:49
uint32 GetEffIndex() const
Definition: SpellAuraEffects.h:56
int32 GetAmount() const
Definition: SpellAuraEffects.h:64
Definition: SpellAuraEffects.h:349
void CallScriptEffectAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition: SpellAuras.cpp:2559
void CallScriptEffectAfterAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition: SpellAuras.cpp:2577
void CallScriptEffectManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition: SpellAuras.cpp:2591
void CallScriptEffectAfterManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition: SpellAuras.cpp:2605
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition: SpellInfo.h:393
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:2322
bool IsPositive() const
Definition: SpellInfo.cpp:1236

References DamageInfo::AbsorbDamage(), AddPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculatePct(), Aura::CallScriptEffectAbsorbHandlers(), Aura::CallScriptEffectAfterAbsorbHandlers(), Aura::CallScriptEffectAfterManaShieldHandlers(), Aura::CallScriptEffectManaShieldHandlers(), createProcFlags(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, SpellInfo::Effects, DamageInfo::GetAbsorb(), AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), DamageInfo::GetAttacker(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraApplication::GetBase(), AuraEffect::GetCaster(), DamageInfo::GetDamage(), DamageInfo::GetDamageType(), GetEffectiveResistChance(), AuraEffect::GetEffIndex(), Object::GetGUID(), SpellInfo::GetMaxRange(), AuraEffect::GetMiscValue(), DamageInfo::GetResist(), DamageInfo::GetSchoolMask(), DamageInfo::GetSpellInfo(), AuraEffect::GetSpellInfo(), Object::GetTypeId(), DamageInfo::GetVictim(), SpellInfo::HasAttribute(), SpellInfo::Id, IsAlive(), IsImmunedToDamageOrSchool(), Object::IsInWorld(), SpellInfo::IsPositive(), WorldObject::IsWithinDist(), MELEE_HIT_NORMAL, ModifyPower(), POWER_MANA, PROC_EX_IMMUNE, PROC_EX_NORMAL_HIT, ProcDamageAndSpellFor(), rand_norm(), Aura::Remove(), DamageInfo::ResistDamage(), RoundToInterval(), SendSpellNonMeleeDamageLog(), AuraEffect::SetAmount(), SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC, SPELL_ATTR4_NO_CAST_LOG, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL, SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL, SPELL_AURA_SCHOOL_ABSORB, SPELL_AURA_SPLIT_DAMAGE_FLAT, SPELL_AURA_SPLIT_DAMAGE_PCT, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NATURE, SPELL_SCHOOL_MASK_NORMAL, and TYPEID_UNIT.

Referenced by CalcAbsorbResist(), CalculateSpellDamageTaken(), DealDamage(), DealMeleeDamage(), Player::EnvironmentalDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and spell_valkyr_touch::spell_valkyr_touchAuraScript::PrepareAuraScript().

◆ CalcArmorReducedDamage()

uint32 Unit::CalcArmorReducedDamage ( Unit const *  attacker,
Unit const *  victim,
const uint32  damage,
SpellInfo const *  spellInfo,
uint8  attackerLevel = 0,
WeaponAttackType  attackType = MAX_ATTACK 
)
static
1996{
1997 float armor = float(victim->GetArmor());
1998
1999 // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
2000 if (attacker)
2001 {
2002 armor += attacker->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
2003
2004 if (spellInfo)
2005 if (Player* modOwner = attacker->GetSpellModOwner())
2006 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
2007
2008 AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
2009 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2010 {
2011 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL
2012 && (*j)->IsAffectedOnSpell(spellInfo))
2013 armor = floor(AddPct(armor, -(*j)->GetAmount()));
2014 }
2015
2016 AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
2017 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2018 {
2019 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
2020 armor = floor(AddPct(armor, -(*j)->GetAmount()));
2021 }
2022
2023 // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc.
2024 if (attacker->IsPlayer())
2025 {
2026 float bonusPct = 0;
2027 AuraEffectList const& armorPenAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT);
2028 for (AuraEffectList::const_iterator itr = armorPenAuras.begin(); itr != armorPenAuras.end(); ++itr)
2029 {
2030 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
2031 {
2032 if (!spellInfo || (*itr)->IsAffectedOnSpell(spellInfo) || (*itr)->GetMiscValue() & spellInfo->GetSchoolMask())
2033 bonusPct += (*itr)->GetAmount();
2034 else if (!(*itr)->GetMiscValue() && !(*itr)->HasSpellClassMask())
2035 bonusPct += (*itr)->GetAmount();
2036 }
2037 else
2038 {
2039 if (attacker->ToPlayer()->HasItemFitToSpellRequirements((*itr)->GetSpellInfo()))
2040 bonusPct += (*itr)->GetAmount();
2041 }
2042 }
2043
2044 float maxArmorPen = 0;
2045 if (victim->GetLevel() < 60)
2046 maxArmorPen = float(400 + 85 * victim->GetLevel());
2047 else
2048 maxArmorPen = 400 + 85 * victim->GetLevel() + 4.5f * 85 * (victim->GetLevel() - 59);
2049
2050 // Cap armor penetration to this number
2051 maxArmorPen = std::min((armor + maxArmorPen) / 3, armor);
2052 // Figure out how much armor do we ignore
2053 float armorPen = CalculatePct(maxArmorPen, bonusPct + attacker->ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION));
2054 // Got the value, apply it
2055 armor -= std::min(armorPen, maxArmorPen);
2056 }
2057 }
2058
2059 if (armor < 0.0f)
2060 armor = 0.0f;
2061
2062 float levelModifier = attacker ? attacker->GetLevel() : attackerLevel;
2063 if (levelModifier > 59)
2064 levelModifier = levelModifier + (4.5f * (levelModifier - 59));
2065
2066 float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
2067 tmpvalue = tmpvalue / (1.0f + tmpvalue);
2068
2069 if (tmpvalue < 0.0f)
2070 tmpvalue = 0.0f;
2071 if (tmpvalue > 0.75f)
2072 tmpvalue = 0.75f;
2073
2074 return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f)));
2075}
@ CR_ARMOR_PENETRATION
Definition: Unit.h:241
@ SPELL_AURA_MOD_ARMOR_PENETRATION_PCT
Definition: SpellAuraDefines.h:343
@ SPELL_AURA_MOD_TARGET_RESISTANCE
Definition: SpellAuraDefines.h:186
@ SPELLMOD_IGNORE_ARMOR
Definition: SpellDefines.h:90

References AddPct(), CalculatePct(), CR_ARMOR_PENETRATION, GetArmor(), GetAuraEffectsByType(), GetLevel(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), Player::HasItemFitToSpellRequirements(), SpellInfo::Id, Object::IsPlayer(), SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_IGNORE_ARMOR, and Object::ToPlayer().

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), boss_priestess_lackey_commonAI::GetThreatMod(), boss_faction_championsAI::GetThreatMod(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcHealAbsorb()

void Unit::CalcHealAbsorb ( HealInfo healInfo)
static
2467{
2468 if (!healInfo.GetHeal())
2469 return;
2470
2471 int32 const healing = static_cast<int32>(healInfo.GetHeal());
2472 int32 absorbAmount = 0;
2473
2474 // Need remove expired auras after
2475 bool existExpired = false;
2476
2477 // absorb without mana cost
2479 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end() && absorbAmount <= healing; ++i)
2480 {
2481 if (!((*i)->GetMiscValue() & healInfo.GetSpellInfo()->SchoolMask))
2482 continue;
2483
2484 // Max Amount can be absorbed by this aura
2485 int32 currentAbsorb = (*i)->GetAmount();
2486
2487 // Found empty aura (impossible but..)
2488 if (currentAbsorb <= 0)
2489 {
2490 existExpired = true;
2491 continue;
2492 }
2493
2494 // currentAbsorb - damage can be absorbed by shield
2495 // If need absorb less damage
2496 if (healing < currentAbsorb + absorbAmount)
2497 currentAbsorb = healing - absorbAmount;
2498
2499 absorbAmount += currentAbsorb;
2500
2501 // Reduce shield amount
2502 (*i)->SetAmount((*i)->GetAmount() - currentAbsorb);
2503 // Need remove it later
2504 if ((*i)->GetAmount() <= 0)
2505 existExpired = true;
2506 }
2507
2508 // Remove all expired absorb auras
2509 if (existExpired)
2510 {
2511 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end();)
2512 {
2513 AuraEffect* auraEff = *i;
2514 ++i;
2515 if (auraEff->GetAmount() <= 0)
2516 {
2517 uint32 removedAuras = healInfo.GetTarget()->m_removedAurasCount;
2519 if (removedAuras + 1 < healInfo.GetTarget()->m_removedAurasCount)
2520 i = vHealAbsorb.begin();
2521 }
2522 }
2523 }
2524
2525 if (absorbAmount > 0)
2526 healInfo.AbsorbHeal(absorbAmount);
2527}
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
Definition: SpellAuraDefines.h:364
SpellInfo const * GetSpellInfo() const
Definition: Unit.h:415
void AbsorbHeal(uint32 amount)
Definition: Unit.h:390
Unit * GetTarget() const
Definition: Unit.h:411
uint32 GetHeal() const
Definition: Unit.h:412
uint32 SchoolMask
Definition: SpellInfo.h:392

References HealInfo::AbsorbHeal(), AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::GetAmount(), GetAuraEffectsByType(), AuraEffect::GetBase(), HealInfo::GetHeal(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), m_removedAurasCount, Aura::Remove(), SpellInfo::SchoolMask, and SPELL_AURA_SCHOOL_HEAL_ABSORB.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), and HealBySpell().

◆ CalcSpellDuration()

int32 Unit::CalcSpellDuration ( SpellInfo const *  spellProto)
14770{
14771 uint8 comboPoints = GetComboPoints();
14772
14773 int32 minduration = spellProto->GetDuration();
14774 int32 maxduration = spellProto->GetMaxDuration();
14775
14776 int32 duration;
14777
14778 if (comboPoints && minduration != -1 && minduration != maxduration)
14779 duration = minduration + int32((maxduration - minduration) * comboPoints / 5);
14780 else
14781 duration = minduration;
14782
14783 return duration;
14784}
uint8 GetComboPoints(Unit const *who=nullptr) const
--------—Combo point system----------------—
Definition: Unit.h:1632

References GetComboPoints(), SpellInfo::GetDuration(), and SpellInfo::GetMaxDuration().

Referenced by Aura::CalcMaxDuration(), Spell::EffectInterruptCast(), Spell::EffectSchoolDMG(), and Aura::HandleAuraSpecificMods().

◆ CalculateAOEDamageReduction()

int32 Unit::CalculateAOEDamageReduction ( int32  damage,
uint32  schoolMask,
Unit caster 
) const
20284{
20285 damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
20286 if (caster && caster->GetTypeId() == TYPEID_UNIT)
20288
20289 return damage;
20290}
@ SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE
Definition: SpellAuraDefines.h:373
@ SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
Definition: SpellAuraDefines.h:292
float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5918

References GetTotalAuraMultiplierByMiscMask(), Object::GetTypeId(), SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE, and TYPEID_UNIT.

Referenced by Spell::DoAllEffectOnLaunchTarget(), AuraEffect::HandlePeriodicDamageAurasTick(), and spell_dk_death_and_decay::RecalculateDamage().

◆ CalculateDamage()

uint32 Unit::CalculateDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
uint8  itemDamagesMask = 0 
)
2949{
2950 float minDamage = 0.0f;
2951 float maxDamage = 0.0f;
2952
2953 if (normalized || !addTotalPct || itemDamagesMask)
2954 {
2955 // get both by default
2956 if (!itemDamagesMask)
2957 {
2958 itemDamagesMask = (1 << 0) | (1 << 1);
2959 }
2960
2961 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2962 {
2963 if (itemDamagesMask & (1 << i))
2964 {
2965 float minTmp, maxTmp;
2966 CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i);
2967 minDamage += minTmp;
2968 maxDamage += maxTmp;
2969 }
2970 }
2971 }
2972 else
2973 {
2974 switch (attType)
2975 {
2976 case RANGED_ATTACK:
2979 break;
2980 case BASE_ATTACK:
2983 break;
2984 case OFF_ATTACK:
2987 break;
2988 default:
2989 break;
2990 }
2991 }
2992
2993 minDamage = std::max(0.f, minDamage);
2994 maxDamage = std::max(0.f, maxDamage);
2995
2996 if (minDamage > maxDamage)
2997 {
2998 std::swap(minDamage, maxDamage);
2999 }
3000
3001 return urand(uint32(minDamage), uint32(maxDamage));
3002}
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:44
@ UNIT_FIELD_MINDAMAGE
Definition: UpdateFields.h:127
@ UNIT_FIELD_MAXDAMAGE
Definition: UpdateFields.h:128
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition: UpdateFields.h:130
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition: UpdateFields.h:169
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition: UpdateFields.h:168
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition: UpdateFields.h:129
float GetFloatValue(uint16 index) const
Definition: Object.cpp:317
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0

References BASE_ATTACK, CalculateMinMaxDamage(), Object::GetFloatValue(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, and urand().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ CalculateDefaultCoefficient()

float Unit::CalculateDefaultCoefficient ( SpellInfo const *  spellInfo,
DamageEffectType  damagetype 
) const
17111{
17112 // Damage over Time spells bonus calculation
17113 float DotFactor = 1.0f;
17114 if (damagetype == DOT)
17115 {
17116 int32 DotDuration = spellInfo->GetDuration();
17117 if (!spellInfo->IsChanneled() && DotDuration > 0)
17118 DotFactor = DotDuration / 15000.0f;
17119
17120 if (uint32 DotTicks = spellInfo->GetMaxTicks())
17121 DotFactor /= DotTicks;
17122 }
17123
17124 int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime();
17125 // Distribute Damage over multiple effects, reduce by AoE
17126 CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime);
17127
17128 // As wowwiki says: C = (Cast Time / 3.5)
17129 return (CastingTime / 3500.0f) * DotFactor;
17130}
@ DOT
Definition: Unit.h:250
uint32 GetCastingTimeForBonus(SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
Definition: Unit.cpp:16992

References SpellInfo::CalcCastTime(), DOT, GetCastingTimeForBonus(), SpellInfo::GetDuration(), SpellInfo::GetMaxTicks(), and SpellInfo::IsChanneled().

Referenced by SpellDamageBonusTaken().

◆ CalculateLevelPenalty()

float Unit::CalculateLevelPenalty ( SpellInfo const *  spellProto) const
3005{
3006 if (GetTypeId() != TYPEID_PLAYER)
3007 return 1.0f;
3008
3009 if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
3010 return 1.0f;
3011
3012 float LvlPenalty = 0.0f;
3013
3014 // xinef: added brackets
3015 if (spellProto->SpellLevel < 20)
3016 LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
3017
3018 float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(GetLevel());
3019 if (LvlFactor > 1.0f)
3020 LvlFactor = 1.0f;
3021
3022 return AddPct(LvlFactor, -LvlPenalty);
3023}
uint8 GetLevel() const
Definition: Unit.h:758

References AddPct(), GetLevel(), Object::GetTypeId(), SpellInfo::MaxLevel, SpellInfo::SpellLevel, and TYPEID_PLAYER.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellDamageBonusDone(), SpellDamageBonusTaken(), and SpellHealingBonusDone().

◆ CalculateMeleeDamage()

void Unit::CalculateMeleeDamage ( Unit victim,
CalcDamageInfo damageInfo,
WeaponAttackType  attackType = BASE_ATTACK,
const bool  sittingVictim = false 
)
1449{
1450 damageInfo->attacker = this;
1451 damageInfo->target = victim;
1452
1453 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1454 {
1455 damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i);
1456 damageInfo->damages[i].damage = 0;
1457 damageInfo->damages[i].absorb = 0;
1458 damageInfo->damages[i].resist = 0;
1459 }
1460
1461 damageInfo->attackType = attackType;
1462 damageInfo->cleanDamage = 0;
1463 damageInfo->blocked_amount = 0;
1464
1465 damageInfo->TargetState = 0;
1466 damageInfo->HitInfo = 0;
1467 damageInfo->procAttacker = PROC_FLAG_NONE;
1468 damageInfo->procVictim = PROC_FLAG_NONE;
1469 damageInfo->procEx = PROC_EX_NONE;
1470 damageInfo->hitOutCome = MELEE_HIT_EVADE;
1471
1472 if (!victim)
1473 return;
1474
1475 if (!IsAlive() || !victim->IsAlive())
1476 return;
1477
1478 // Select HitInfo/procAttacker/procVictim flag based on attack type
1479 switch (attackType)
1480 {
1481 case BASE_ATTACK:
1484 break;
1485 case OFF_ATTACK:
1488 damageInfo->HitInfo = HITINFO_OFFHAND;
1489 break;
1490 default:
1491 return;
1492 }
1493
1494 // School Immune check
1495 uint8 immunedMask = 0;
1496 bool hasNonPhysicalSchoolMask = false;
1497 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1498 {
1500 {
1501 immunedMask |= (1 << i);
1503 {
1504 hasNonPhysicalSchoolMask = true;
1505 }
1506 }
1507 }
1508
1509 // School Immune check
1510 if (immunedMask & ((1 << 0) | (1 << 1)))
1511 {
1512 if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1)))
1513 {
1514 damageInfo->HitInfo |= HITINFO_NORMALSWING;
1515 damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
1516
1517 damageInfo->procEx |= PROC_EX_IMMUNE;
1518 return;
1519 }
1520 }
1521
1522 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1523 {
1524 // only players have secondary weapon damage
1525 if (i > 0 && GetTypeId() != TYPEID_PLAYER)
1526 {
1527 break;
1528 }
1529
1530 if (immunedMask & (1 << i))
1531 {
1532 continue;
1533 }
1534
1535 SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask);
1536 bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL);
1537
1538 uint32 damage = 0;
1539 uint8 itemDamagesMask = (IsPlayer()) ? (1 << i) : 0;
1540
1541 damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask);
1542 // Add melee damage bonus
1543 damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask);
1544 damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask);
1545
1546 // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1547 sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1548
1549 if (victim->GetAI())
1550 {
1551 victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);
1552 }
1553
1554 // Calculate armor reduction
1556 {
1557 damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType);
1558 damageInfo->cleanDamage += damage - damageInfo->damages[i].damage;
1559 }
1560 else
1561 {
1562 damageInfo->damages[i].damage = damage;
1563 }
1564 }
1565
1566 damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
1567
1568 // If the victim was a sitting player and we didn't roll a miss, then crit.
1569 if (sittingVictim && damageInfo->hitOutCome != MELEE_HIT_MISS)
1570 {
1571 damageInfo->hitOutCome = MELEE_HIT_CRIT;
1572 }
1573 switch (damageInfo->hitOutCome)
1574 {
1575 case MELEE_HIT_EVADE:
1577 damageInfo->TargetState = VICTIMSTATE_EVADES;
1578 damageInfo->procEx |= PROC_EX_EVADE;
1579
1580 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1581 {
1582 damageInfo->damages[i].damage = 0;
1583 }
1584
1585 damageInfo->cleanDamage = 0;
1586 return;
1587 case MELEE_HIT_MISS:
1588 damageInfo->HitInfo |= HITINFO_MISS;
1589 damageInfo->TargetState = VICTIMSTATE_INTACT;
1590 damageInfo->procEx |= PROC_EX_MISS;
1591
1592 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1593 {
1594 damageInfo->damages[i].damage = 0;
1595 }
1596 damageInfo->cleanDamage = 0;
1597 break;
1598 case MELEE_HIT_NORMAL:
1599 damageInfo->TargetState = VICTIMSTATE_HIT;
1600 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1601 break;
1602 case MELEE_HIT_CRIT:
1603 {
1604 damageInfo->HitInfo |= HITINFO_CRITICALHIT;
1605 damageInfo->TargetState = VICTIMSTATE_HIT;
1606
1607 damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
1608 // Crit bonus calc
1609 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1610 {
1611 damageInfo->damages[i].damage *= 2;
1612
1613 float mod = 0.0f;
1614 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1615 if (damageInfo->attackType == RANGED_ATTACK)
1616 {
1618 }
1619 else
1620 {
1622
1623 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1625 }
1626
1627 uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask();
1628
1629 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1631 if (mod != 0)
1632 {
1633 AddPct(damageInfo->damages[i].damage, mod);
1634 }
1635 }
1636 break;
1637 }
1638 case MELEE_HIT_PARRY:
1639 damageInfo->TargetState = VICTIMSTATE_PARRY;
1640 damageInfo->procEx |= PROC_EX_PARRY;
1641 damageInfo->cleanDamage = 0;
1642
1643 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1644 {
1645 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1646 damageInfo->damages[i].damage = 0;
1647 }
1648 break;
1649 case MELEE_HIT_DODGE:
1650 damageInfo->TargetState = VICTIMSTATE_DODGE;
1651 damageInfo->procEx |= PROC_EX_DODGE;
1652 damageInfo->cleanDamage = 0;
1653
1654 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1655 {
1656 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1657 damageInfo->damages[i].damage = 0;
1658 }
1659 break;
1660 case MELEE_HIT_BLOCK:
1661 {
1662 damageInfo->TargetState = VICTIMSTATE_HIT;
1663 damageInfo->HitInfo |= HITINFO_BLOCK;
1664 damageInfo->procEx |= PROC_EX_BLOCK;
1665 damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
1666 // double blocked amount if block is critical
1667 if (damageInfo->target->isBlockCritical())
1668 damageInfo->blocked_amount += damageInfo->blocked_amount;
1669
1670 uint32 remainingBlock = damageInfo->blocked_amount;
1671 uint8 fullBlockMask = 0;
1672 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1673 {
1674 if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage)
1675 {
1676 fullBlockMask |= (1 << i);
1677
1678 remainingBlock -= damageInfo->damages[i].damage;
1679 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1680 damageInfo->damages[i].damage = 0;
1681 }
1682 else
1683 {
1684 damageInfo->cleanDamage += remainingBlock;
1685 damageInfo->damages[i].damage -= remainingBlock;
1686 remainingBlock = 0;
1687 }
1688 }
1689
1690 // full block
1691 if (fullBlockMask == ((1 << 0) | (1 << 1)))
1692 {
1693 damageInfo->TargetState = VICTIMSTATE_BLOCKS;
1694 damageInfo->procEx |= PROC_EX_FULL_BLOCK;
1695 damageInfo->blocked_amount -= remainingBlock;
1696 }
1697 break;
1698 }
1699 case MELEE_HIT_GLANCING:
1700 {
1701 damageInfo->HitInfo |= HITINFO_GLANCING;
1702 damageInfo->TargetState = VICTIMSTATE_HIT;
1703 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1704 int32 leveldif = int32(victim->GetLevel()) - int32(GetLevel());
1705 if (leveldif > 3)
1706 leveldif = 3;
1707 float reducePercent = 1 - leveldif * 0.1f;
1708
1709 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1710 {
1711 uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage);
1712 damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage;
1713 damageInfo->damages[i].damage = reducedDamage;
1714 }
1715 break;
1716 }
1717 case MELEE_HIT_CRUSHING:
1718 damageInfo->HitInfo |= HITINFO_CRUSHING;
1719 damageInfo->TargetState = VICTIMSTATE_HIT;
1720 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1721
1722 // 150% normal damage
1723 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1724 {
1725 damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2);
1726 }
1727 break;
1728 default:
1729 break;
1730 }
1731
1732 // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
1733 if (!(damageInfo->HitInfo & HITINFO_MISS))
1734 damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
1735
1736 uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { };
1737
1738 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1739 {
1740 int32 dmg = damageInfo->damages[i].damage;
1741 int32 cleanDamage = damageInfo->cleanDamage;
1742 // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here
1743 if (CanApplyResilience())
1744 {
1745 int32 resilienceReduction = damageInfo->damages[i].damage;
1746 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
1747
1748 resilienceReduction = damageInfo->damages[i].damage - resilienceReduction;
1749 dmg -= resilienceReduction;
1750 cleanDamage += resilienceReduction;
1751 }
1752
1753 damageInfo->damages[i].damage = std::max(0, dmg);
1754 damageInfo->cleanDamage = std::max(0, cleanDamage);
1755
1756 // Calculate absorb resist
1757 if (damageInfo->damages[i].damage > 0)
1758 {
1759 damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
1760
1761 // Calculate absorb & resists
1762 DamageInfo dmgInfo(*damageInfo, i);
1763 Unit::CalcAbsorbResist(dmgInfo);
1764 damageInfo->damages[i].absorb = dmgInfo.GetAbsorb();
1765 damageInfo->damages[i].resist = dmgInfo.GetResist();
1766
1767 if (damageInfo->damages[i].absorb)
1768 {
1769 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
1770 }
1771
1772 if (damageInfo->damages[i].resist)
1773 {
1774 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
1775 }
1776
1777 damageInfo->damages[i].damage = dmgInfo.GetDamage();
1778 }
1779 }
1780
1781 // set proper HitInfo flags
1782 if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0)
1783 {
1784 // set partial absorb when secondary damage isn't full absorbed
1785 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB;
1786 }
1787 else
1788 {
1789 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB);
1790 }
1791
1792 if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0)
1793 {
1794 // set partial resist when secondary damage isn't full resisted
1795 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST;
1796 }
1797 else
1798 {
1799 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
1800 }
1801
1803 {
1804 damageInfo->procEx |= PROC_EX_ABSORB;
1805 }
1806
1807 if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
1808 {
1809 damageInfo->procEx |= PROC_EX_RESIST;
1810 }
1811}
@ VICTIMSTATE_INTACT
Definition: Unit.h:83
@ VICTIMSTATE_HIT
Definition: Unit.h:84
@ VICTIMSTATE_DODGE
Definition: Unit.h:85
@ VICTIMSTATE_IS_IMMUNE
Definition: Unit.h:90
@ VICTIMSTATE_PARRY
Definition: Unit.h:86
@ VICTIMSTATE_BLOCKS
Definition: Unit.h:88
@ VICTIMSTATE_EVADES
Definition: Unit.h:89
@ HITINFO_PARTIAL_ABSORB
Definition: Unit.h:103
@ HITINFO_FULL_RESIST
Definition: Unit.h:104
@ HITINFO_NORMALSWING
Definition: Unit.h:96
@ HITINFO_BLOCK
Definition: Unit.h:110
@ HITINFO_CRUSHING
Definition: Unit.h:114
@ HITINFO_SWINGNOHITSOUND
Definition: Unit.h:118
@ HITINFO_MISS
Definition: Unit.h:101
@ HITINFO_FULL_ABSORB
Definition: Unit.h:102
@ HITINFO_OFFHAND
Definition: Unit.h:99
@ HITINFO_GLANCING
Definition: Unit.h:113
@ HITINFO_CRITICALHIT
Definition: Unit.h:106
@ HITINFO_PARTIAL_RESIST
Definition: Unit.h:105
@ HITINFO_AFFECTS_VICTIM
Definition: Unit.h:98
@ MELEE_HIT_CRUSHING
Definition: Unit.h:286
@ MELEE_HIT_BLOCK
Definition: Unit.h:285
@ MELEE_HIT_CRIT
Definition: Unit.h:286
@ MELEE_HIT_EVADE
Definition: Unit.h:285
@ MELEE_HIT_DODGE
Definition: Unit.h:285
@ MELEE_HIT_MISS
Definition: Unit.h:285
@ MELEE_HIT_PARRY
Definition: Unit.h:285
@ MELEE_HIT_GLANCING
Definition: Unit.h:286
@ SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
Definition: SpellAuraDefines.h:232
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE
Definition: SpellAuraDefines.h:267
@ SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
Definition: SpellAuraDefines.h:226
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
Definition: SpellAuraDefines.h:266
@ PROC_EX_NONE
Definition: SpellMgr.h:193
@ PROC_EX_DODGE
Definition: SpellMgr.h:198
@ PROC_EX_BLOCK
Definition: SpellMgr.h:200
@ PROC_EX_CRITICAL_HIT
Definition: SpellMgr.h:195
@ PROC_EX_MISS
Definition: SpellMgr.h:196
@ PROC_EX_RESIST
Definition: SpellMgr.h:197
@ PROC_EX_FULL_BLOCK
Definition: SpellMgr.h:207
@ PROC_EX_ABSORB
Definition: SpellMgr.h:204
@ PROC_EX_PARRY
Definition: SpellMgr.h:199
@ PROC_EX_EVADE
Definition: SpellMgr.h:201
@ PROC_FLAG_DONE_MELEE_AUTO_ATTACK
Definition: SpellMgr.h:110
@ PROC_FLAG_DONE_MAINHAND_ATTACK
Definition: SpellMgr.h:140
@ PROC_FLAG_TAKEN_DAMAGE
Definition: SpellMgr.h:137
@ PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK
Definition: SpellMgr.h:111
@ PROC_FLAG_DONE_OFFHAND_ATTACK
Definition: SpellMgr.h:141
@ PROC_FLAG_NONE
Definition: SpellMgr.h:105
virtual void OnCalculateMeleeDamageReceived(uint32 &, Unit *)
Definition: UnitAI.h:379
uint32 damageSchoolMask
Definition: Unit.h:469
uint32 blocked_amount
Definition: Unit.h:475
MeleeHitOutcome hitOutCome
Definition: Unit.h:484
uint32 cleanDamage
Definition: Unit.h:483
uint32 TargetState
Definition: Unit.h:477
uint32 resist
Definition: Unit.h:472
uint32 HitInfo
Definition: Unit.h:476
bool isBlockCritical()
Definition: Unit.cpp:3086
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition: Unit.cpp:13197
virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5905
bool CanApplyResilience() const
Definition: Unit.h:1769
uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
Definition: Unit.cpp:2948
virtual uint32 GetShieldBlockValue() const =0
static void ApplyResilience(Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
Definition: Unit.cpp:18830
UnitAI * GetAI()
Definition: Unit.h:656
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
Definition: Unit.cpp:1972
int32 GetTotalAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5854
MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const *victim, WeaponAttackType attType) const
Definition: Unit.cpp:2745
uint32 GetCreatureTypeMask() const
Definition: Unit.h:872
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition: Unit.cpp:12995

References CalcDamageInfo::absorb, AddPct(), CalcDamageInfo::attacker, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcArmorReducedDamage(), CalculateDamage(), CalcDamageInfo::cleanDamage, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, GetAI(), GetCreatureTypeMask(), GetLevel(), GetMeleeDamageSchoolMask(), GetShieldBlockValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplierByMiscMask(), Object::GetTypeId(), CalcDamageInfo::HitInfo, HITINFO_AFFECTS_VICTIM, HITINFO_BLOCK, HITINFO_CRITICALHIT, HITINFO_CRUSHING, HITINFO_GLANCING, HITINFO_MISS, HITINFO_NORMALSWING, HITINFO_OFFHAND, HITINFO_SWINGNOHITSOUND, CalcDamageInfo::hitOutCome, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, MeleeDamageBonusDone(), MeleeDamageBonusTaken(), OFF_ATTACK, UnitAI::OnCalculateMeleeDamageReceived(), PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_EVADE, PROC_EX_FULL_BLOCK, PROC_EX_IMMUNE, PROC_EX_MISS, PROC_EX_NONE, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_NONE, PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RANGED_ATTACK, CalcDamageInfo::resist, RollMeleeOutcomeAgainst(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_SCHOOL_MASK_NORMAL, sScriptMgr, CalcDamageInfo::target, CalcDamageInfo::TargetState, TYPEID_PLAYER, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, VICTIMSTATE_EVADES, VICTIMSTATE_HIT, VICTIMSTATE_INTACT, VICTIMSTATE_IS_IMMUNE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ CalculateMinMaxDamage()

virtual void Unit::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex = 0 
)
pure virtual

Implemented in Creature, and Player.

Referenced by CalculateDamage(), and UpdateDamagePhysical().

◆ CalculateSpellDamage()

int32 Unit::CalculateSpellDamage ( Unit const *  target,
SpellInfo const *  spellProto,
uint8  effect_index,
int32 const *  basePoints = nullptr 
) const

◆ CalculateSpellDamageTaken()

void Unit::CalculateSpellDamageTaken ( SpellNonMeleeDamage damageInfo,
int32  damage,
SpellInfo const *  spellInfo,
WeaponAttackType  attackType = BASE_ATTACK,
bool  crit = false 
)
1280{
1281 if (damage < 0)
1282 return;
1283
1284 Unit* victim = damageInfo->target;
1285 if (!victim || !victim->IsAlive())
1286 return;
1287
1288 SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask);
1289 uint32 crTypeMask = victim->GetCreatureTypeMask();
1290
1291 // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1292 sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
1293
1294 if (victim->GetAI())
1295 {
1296 victim->GetAI()->OnCalculateSpellDamageReceived(damage, this);
1297 }
1298
1299 int32 cleanDamage = 0;
1300 if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
1301 {
1302 int32 oldDamage = damage;
1303 damage = Unit::CalcArmorReducedDamage(this, victim, damage, spellInfo, 0, attackType);
1304 cleanDamage = oldDamage - damage;
1305 }
1306
1307 bool blocked = false;
1308 // Per-school calc
1309 switch (spellInfo->DmgClass)
1310 {
1311 // Melee and Ranged Spells
1314 {
1315 // Physical Damage
1316 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
1317 {
1318 // Get blocked status
1319 blocked = isSpellBlocked(victim, spellInfo, attackType);
1320 }
1321
1322 if (crit)
1323 {
1324 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1325
1326 // Calculate crit bonus
1327 uint32 crit_bonus = damage;
1328 // Apply crit_damage bonus for melee spells
1329 if (Player* modOwner = GetSpellModOwner())
1330 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
1331 damage += crit_bonus;
1332
1333 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1334 float critPctDamageMod = 0.0f;
1335 if (attackType == RANGED_ATTACK)
1337 else
1339
1340 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1341 critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask());
1342
1343 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1345
1346 if (critPctDamageMod != 0)
1347 AddPct(damage, critPctDamageMod);
1348 }
1349
1350 // Spell weapon based damage CAN BE crit & blocked at same time
1351 if (blocked)
1352 {
1353 damageInfo->blocked = victim->GetShieldBlockValue();
1354 // double blocked amount if block is critical
1355 if (victim->isBlockCritical())
1356 damageInfo->blocked *= 2;
1357 if (damage < int32(damageInfo->blocked))
1358 damageInfo->blocked = uint32(damage);
1359
1360 damage -= damageInfo->blocked;
1361 cleanDamage += damageInfo->blocked;
1362 }
1363
1364 int32 resilienceReduction = damage;
1365 if (CanApplyResilience())
1366 {
1367 if (attackType != RANGED_ATTACK)
1368 {
1369 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_MELEE);
1370 }
1371 else
1372 {
1373 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_RANGED);
1374 }
1375 }
1376
1377 resilienceReduction = damage - resilienceReduction;
1378 damage -= resilienceReduction;
1379 cleanDamage += resilienceReduction;
1380 break;
1381 }
1382 // Magical Attacks
1385 {
1386 // If crit add critical bonus
1387 if (crit)
1388 {
1389 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1390 damage = Unit::SpellCriticalDamageBonus(this, spellInfo, damage, victim);
1391 }
1392
1393 int32 resilienceReduction = damage;
1394 if (CanApplyResilience())
1395 {
1396 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_SPELL);
1397 }
1398
1399 resilienceReduction = damage - resilienceReduction;
1400 damage -= resilienceReduction;
1401 cleanDamage += resilienceReduction;
1402 break;
1403 }
1404 default:
1405 break;
1406 }
1407
1408 damageInfo->cleanDamage = std::max(0, cleanDamage);
1409 damageInfo->damage = std::max(0, damage);
1410
1411 // Calculate absorb resist
1412 if (damageInfo->damage > 0)
1413 {
1414 DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE);
1415 Unit::CalcAbsorbResist(dmgInfo);
1416 damageInfo->absorb = dmgInfo.GetAbsorb();
1417 damageInfo->resist = dmgInfo.GetResist();
1418 damageInfo->damage = dmgInfo.GetDamage();
1419 }
1420}
@ SPELL_DIRECT_DAMAGE
Definition: Unit.h:249
@ SPELLMOD_CRIT_DAMAGE_BONUS
Definition: SpellDefines.h:92
@ SPELL_DAMAGE_CLASS_RANGED
Definition: SharedDefines.h:1548
@ SPELL_DAMAGE_CLASS_MAGIC
Definition: SharedDefines.h:1546
@ SPELL_DAMAGE_CLASS_NONE
Definition: SharedDefines.h:1545
@ SPELL_DAMAGE_CLASS_MELEE
Definition: SharedDefines.h:1547
@ SPELL_HIT_TYPE_CRIT
Definition: SharedDefines.h:1536
virtual void OnCalculateSpellDamageReceived(int32 &, Unit *)
Definition: UnitAI.h:380
Unit * target
Definition: Unit.h:495
uint32 HitInfo
Definition: Unit.h:506
uint32 damage
Definition: Unit.h:498
uint32 absorb
Definition: Unit.h:501
Unit * attacker
Definition: Unit.h:496
uint32 schoolMask
Definition: Unit.h:500
uint32 cleanDamage
Definition: Unit.h:508
uint32 resist
Definition: Unit.h:502
uint32 blocked
Definition: Unit.h:505
bool isSpellBlocked(Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
Definition: Unit.cpp:3060
static uint32 SpellCriticalDamageBonus(Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
Definition: Unit.cpp:12202

References SpellNonMeleeDamage::absorb, AddPct(), ApplyResilience(), SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CalcAbsorbResist(), CalcArmorReducedDamage(), CanApplyResilience(), SpellNonMeleeDamage::cleanDamage, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, SpellNonMeleeDamage::damage, SpellInfo::DmgClass, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), GetShieldBlockValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), isSpellBlocked(), UnitAI::OnCalculateSpellDamageReceived(), RANGED_ATTACK, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_DIRECT_DAMAGE, SPELL_HIT_TYPE_CRIT, SPELL_SCHOOL_MASK_NORMAL, SpellCriticalDamageBonus(), SPELLMOD_CRIT_DAMAGE_BONUS, sScriptMgr, and SpellNonMeleeDamage::target.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ CanApplyResilience()

◆ CanDualWield()

◆ CanEnterWater()

virtual bool Unit::CanEnterWater ( ) const
pure virtual

Implemented in Creature, and Player.

◆ CanFly()

◆ CanFreeMove()

bool Unit::CanFreeMove ( ) const
inline
742 {
745 }
@ UNIT_STATE_DISTRACTED
Definition: UnitDefines.h:161
@ UNIT_STATE_CONFUSED
Definition: UnitDefines.h:160
@ UNIT_STATE_FLEEING
Definition: UnitDefines.h:156
@ UNIT_STATE_IN_FLIGHT
Definition: UnitDefines.h:157
@ UNIT_STATE_STUNNED
Definition: UnitDefines.h:152

References GetOwnerGUID(), HasUnitState(), UNIT_STATE_CONFUSED, UNIT_STATE_DISTRACTED, UNIT_STATE_FLEEING, UNIT_STATE_IN_FLIGHT, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by SpellInfo::CheckTarget(), and Creature::IsFreeToMove().

◆ CanHaveThreatList()

bool Unit::CanHaveThreatList ( ) const
14528{
14529 // only creatures can have threat list
14530 if (GetTypeId() != TYPEID_UNIT)
14531 return false;
14532
14533 // only alive units can have threat list
14534 if (!IsAlive() || isDying())
14535 return false;
14536
14537 // totems can not have threat list
14538 if (ToCreature()->IsTotem())
14539 return false;
14540
14541 // vehicles can not have threat list
14542 if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())
14543 return false;
14544
14545 // summons can not have a threat list, unless they are controlled by a creature
14547 return false;
14548
14549 return true;
14550}
@ UNIT_MASK_CONTROLABLE_GUARDIAN
Definition: UnitDefines.h:143
@ UNIT_MASK_GUARDIAN
Definition: UnitDefines.h:137
Map * GetMap() const
Definition: Object.h:529
bool IsVehicle() const
Definition: Unit.h:756
bool isDying() const
Definition: Unit.h:1151

References WorldObject::GetMap(), GetOwnerGUID(), Object::GetTypeId(), HasUnitTypeMask(), IsAlive(), isDying(), Object::IsPlayer(), IsTotem(), IsVehicle(), Object::ToCreature(), TYPEID_UNIT, UNIT_MASK_CONTROLABLE_GUARDIAN, UNIT_MASK_GUARDIAN, and UNIT_MASK_MINION.

Referenced by AddThreat(), Creature::CanPeriodicallyCallForAssistance(), ThreatMgr::ClearAllThreat(), DealDamage(), ScriptedAI::DoResetThreatList(), CreatureAI::DoZoneInCombat(), Spell::EffectTaunt(), Spell::EffectThreat(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleModTaunt(), Spell::HandleThreatSpells(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), Creature::SelectVictim(), TauntApply(), TauntFadeOut(), and Update().

◆ CanInstantCast()

bool Unit::CanInstantCast ( ) const
inline
1779{ return _instantCast; }

References _instantCast.

Referenced by ModSpellCastTime().

◆ CanModifyStats()

◆ CanProc()

bool Unit::CanProc ( )
inline
1662{return !m_procDeep;}

References m_procDeep.

Referenced by Spell::DoAllEffectOnTarget().

◆ CanRestoreMana()

bool Unit::CanRestoreMana ( SpellInfo const *  spellInfo) const
21096{
21097 // Aura of Despair exceptions
21098 switch (spellInfo->Id)
21099 {
21100 case 16666: // Demonic Rune
21101 case 27869: // Dark Rune
21102 case 30824: // Shamanistic Rage
21103 case 31786: // Spiritual Attunement
21104 case 31930: // Judgements of the Wise
21105 case 34075: // Aspect of the Viper
21106 case 34720: // Thrill of the hunt
21107 case 47755: // Rapture
21108 case 54425: // Improved Felhunter
21109 case 57319: // Blessing of Sanctuary
21110 case 63337: // Saronite Vapors (regenerate mana)
21111 case 63375: // Improved stormstrike
21112 case 64372: // Lifebloom
21113 case 68285: // Improved Leader of the Pack
21114 return true;
21115 case 54428: // Divine Plea - only with talent Guarded by the Light
21116 return HasSpell(53583);
21117 default:
21118 break;
21119 }
21120
21121 return false;
21122}
virtual bool HasSpell(uint32) const
Definition: Unit.h:1045

References HasSpell(), and SpellInfo::Id.

Referenced by IsImmunedToSpellEffect().

◆ CanSwim()

bool Unit::CanSwim ( ) const
virtual

this method checks the current flag of a unit

These flags can be set within the database or dynamically changed at runtime UNIT_FLAG_SWIMMING must be updated when a unit enters a swimmable area

Reimplemented in Creature.

19871{
19872 // Mirror client behavior, if this method returns false then client will not use swimming animation and for players will apply gravity as if there was no water
19874 return false;
19876 return true;
19878 return false;
19880 return true;
19882}
@ UNIT_FLAG2_UNUSED_6
Definition: UnitDefines.h:286
@ UNIT_FLAG_CANNOT_SWIM
Definition: UnitDefines.h:243
@ UNIT_FLAG_POSSESSED
Definition: UnitDefines.h:253
@ UNIT_FLAG_SWIMMING
Definition: UnitDefines.h:244
@ UNIT_FLAG_RENAME
Definition: UnitDefines.h:233
@ UNIT_FLAG_PET_IN_COMBAT
Definition: UnitDefines.h:240
bool HasUnitFlag2(UnitFlags2 flags) const
Definition: Unit.h:830

References HasUnitFlag(), HasUnitFlag2(), UNIT_FLAG2_UNUSED_6, UNIT_FLAG_CANNOT_SWIM, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_POSSESSED, UNIT_FLAG_RENAME, and UNIT_FLAG_SWIMMING.

Referenced by Creature::CanSwim().

◆ CanUseAttackType()

◆ CastCustomSpell() [1/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1235{
1236 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1237 if (!spellInfo)
1238 {
1239 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1241 }
1242
1243 SpellCastTargets targets;
1244 targets.SetUnitTarget(victim);
1245
1246 return CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster);
1247}
#define LOG_ERROR(filterType__,...)
Definition: Log.h:156
@ SPELL_FAILED_SPELL_UNAVAILABLE
Definition: SharedDefines.h:1056
Definition: Spell.h:109
void SetUnitTarget(Unit *target)
Definition: Spell.cpp:239

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetUnitTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastCustomSpell() [2/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1221{
1222 CustomSpellValues values;
1223 values.AddSpellMod(mod, value);
1224 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1225}
@ TRIGGERED_NONE
Definition: SpellDefines.h:131
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition: Unit.cpp:1208
Definition: SpellDefines.h:163
void AddSpellMod(SpellValueMod mod, int32 value)
Definition: SpellDefines.h:165

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastCustomSpell() [3/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1228{
1229 CustomSpellValues values;
1230 values.AddSpellMod(mod, value);
1231 return CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster);
1232}

References CustomSpellValues::AddSpellMod(), and CastCustomSpell().

◆ CastCustomSpell() [4/4]

SpellCastResult Unit::CastCustomSpell ( Unit victim,
uint32  spellId,
int32 const *  bp0,
int32 const *  bp1,
int32 const *  bp2,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1209{
1210 CustomSpellValues values;
1211 if (bp0)
1212 values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0);
1213 if (bp1)
1214 values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1);
1215 if (bp2)
1216 values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2);
1217 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1218}
@ SPELLVALUE_BASE_POINT1
Definition: SpellDefines.h:115
@ SPELLVALUE_BASE_POINT2
Definition: SpellDefines.h:116
@ SPELLVALUE_BASE_POINT0
Definition: SpellDefines.h:114

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

Referenced by spell_pri_guardian_spirit::Absorb(), spell_mage_fire_frost_ward::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_the_lich_king_necrotic_plague_jump_aura::AfterDispel(), spell_dru_lifebloom::AfterRemove(), Player::ApplyEnchantment(), Player::ApplyEquipSpell(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), npc_gas_cloud::npc_gas_cloudAI::CastMainSpell(), CastPetAura(), spell_ruby_sanctum_rallying_shout::CountAllies(), spell_igb_rocket_artillery_explosion::DamageGunship(), boss_leotheras_the_blind::DemonTime(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), Spell::EffectDestroyAllTotems(), Spell::EffectDispel(), Spell::EffectFeedPet(), Spell::EffectForceCast(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonType(), EnterVehicle(), EnterVehicleUnattackable(), AuraMunchingQueue::Execute(), TriggerWickedSpirit::Execute(), spell_sha_totem_of_wrath::HandleAfterCast(), spell_reflective_shield_aura::HandleAfterEffectAbsorb(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_pri_shadow_word_death::HandleDamage(), spell_dk_corpse_explosion::HandleDamage(), spell_dru_lifebloom::HandleDispel(), spell_igb_burning_pitch::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_deathbringer_blood_link::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_gen_dummy_trigger::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_pal_divine_storm_dummy::HandleDummy(), spell_sha_ancestral_awakening_proc::HandleDummy(), spell_sha_cleansing_totem_pulse::HandleDummy(), spell_warl_life_tap::HandleDummy(), spell_warr_last_stand::HandleDummy(), spell_warr_charge::HandleDummy(), spell_warr_slam::HandleDummy(), spell_warr_bloodthirst::HandleDummy(), HandleDummyAuraProc(), spell_egg_explosion::HandleDummyHitTarget(), spell_warr_execute::HandleEffect(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_serpentshrine_cavern_infection::HandleEffectRemove(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_ragin_flames_inferno::HandlePeriodic(), spell_dk_death_and_decay_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_deathbringer_blood_link_aura::HandleProc(), spell_deathbringer_blood_link_blood_beast_aura::HandleProc(), spell_reliquary_of_souls_aura_of_desire_aura::HandleProc(), spell_black_temple_consuming_strikes_aura::HandleProc(), spell_item_blade_ward_enchant::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), spell_dru_living_seed_proc::HandleProc(), spell_hun_ascpect_of_the_viper::HandleProc(), spell_sha_earth_shield::HandleProc(), spell_the_lich_king_dark_hunger_aura::HandleProc(), spell_yogg_saron_grim_reprisal_aura::HandleProc(), spell_dk_wandering_plague_aura::HandleProc(), spell_dk_blood_gorged::HandleProc(), spell_dru_living_seed::HandleProc(), spell_gen_blade_warding::HandleProc(), spell_hun_glyph_of_arcane_shot::HandleProc(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_item_necrotic_touch::HandleProc(), spell_mage_burnout::HandleProc(), spell_pal_seal_of_command_aura::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pal_seal_of_righteousness::HandleProc(), spell_pri_divine_aegis::HandleProc(), spell_pri_glyph_of_prayer_of_healing::HandleProc(), spell_rog_blade_flurry::HandleProc(), spell_sha_item_mana_surge::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellWithValueAuraProc(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_igb_rocket_pack_aura::HandleRemove(), spell_warl_haunt_aura::HandleRemove(), spell_pal_lay_on_hands::HandleScript(), spell_kelthuzad_detonate_mana_aura::HandleScript(), spell_q12919_gymers_grab::HandleScript(), spell_gluth_decimate::HandleScriptEffect(), spell_hun_chimera_shot::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HandleSpellClick(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), spell_halion_damage_aoe_summon::HandleSummon(), spell_putricide_mutated_transformation::HandleSummon(), spell_putricide_mutated_plague_aura::HandleTriggerSpell(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::JustEngagedWith(), boss_mother_shahraz::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_morogrim_tidewalker::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_frost_tomb::npc_frost_tombAI::npc_frost_tombAI(), spell_dru_tiger_s_fury::OnHit(), spell_gen_flurry_of_claws::OnPeriodic(), spell_blood_queen_essence_of_the_blood_queen_aura::OnProc(), spell_pal_eye_for_an_eye::OnProc(), spell_warl_siphon_life::OnProc(), spell_warl_fel_synergy::OnProc(), spell_warr_improved_spell_reflection::OnProc(), spell_warr_damage_shield::OnProc(), spell_kalecgos_curse_of_boundless_agony_aura::OnRemove(), spell_halion_marks_aura::OnRemove(), spell_putricide_mutated_plague_aura::OnRemove(), spell_the_lich_king_necrotic_plague_aura::OnRemove(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), spell_sindragosa_instability_aura::OnRemove(), spell_the_lich_king_necrotic_plague_jump_aura::OnRemove(), spell_karazhan_overload_aura::PeriodicTick(), spell_doomfire::PeriodicTick(), spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick(), spell_broggok_poison_cloud::PeriodicTick(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11198_take_down_tethyr::PrepareSpellScript(), spell_illidari_council_reflective_shield_aura::ReflectDamage(), spell_pri_power_word_shield_aura::ReflectDamage(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), boss_magtheridon::ScheduleCombatEvents(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), boss_viscidus::SummonedCreatureDies(), spell_dk_anti_magic_shell_self::Trigger(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), spell_the_lich_king_life_siphon::TriggerHeal(), spell_pal_divine_storm::TriggerHeal(), spell_black_temple_shadow_inferno_aura::Update(), spell_black_temple_spell_absorption_aura::Update(), boss_felblood_kaelthas::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), boss_huhuran::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_living_constellation::npc_living_constellationAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), and boss_toravon::boss_toravonAI::UpdateAI().

◆ CastDelayedSpellWithPeriodicAmount()

void Unit::CastDelayedSpellWithPeriodicAmount ( Unit caster,
uint32  spellId,
AuraType  auraType,
int32  addAmount,
uint8  effectIndex = 0 
)
20197{
20198 for (AuraEffectList::iterator i = m_modAuras[auraType].begin(); i != m_modAuras[auraType].end(); ++i)
20199 {
20200 AuraEffect* aurEff = *i;
20201 if (aurEff->GetCasterGUID() != caster->GetGUID() || aurEff->GetId() != spellId || aurEff->GetEffIndex() != effectIndex || !aurEff->GetTotalTicks())
20202 continue;
20203
20204 addAmount += ((aurEff->GetOldAmount() * std::max<int32>(aurEff->GetTotalTicks() - int32(aurEff->GetTickNumber()), 0)) / aurEff->GetTotalTicks());
20205 break;
20206 }
20207
20208 // xinef: delay only for casting on different unit
20209 if (this == caster || !sWorld->getBoolConfig(CONFIG_MUNCHING_BLIZZLIKE))
20210 caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, addAmount, this, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_NO_PERIODIC_RESET), nullptr, nullptr, caster->GetGUID());
20211 else
20212 caster->m_Events.AddEvent(new AuraMunchingQueue(*caster, GetGUID(), addAmount, spellId), caster->m_Events.CalculateQueueTime(400));
20213}
TriggerCastFlags
Definition: SpellDefines.h:130
@ TRIGGERED_NO_PERIODIC_RESET
Will ignore equipped item requirements.
Definition: SpellDefines.h:150
@ CONFIG_MUNCHING_BLIZZLIKE
Definition: IWorld.h:189
uint64 CalculateQueueTime(uint64 delay) const
Definition: EventProcessor.cpp:164
Definition: Unit.cpp:20176
uint32 GetTickNumber() const
Definition: SpellAuraEffects.h:87
int32 GetOldAmount() const
Definition: SpellAuraEffects.h:116
uint32 GetId() const
Definition: SpellAuraEffects.cpp:432
int32 GetTotalTicks() const
Definition: SpellAuraEffects.cpp:7365
ObjectGuid GetCasterGUID() const
Definition: SpellAuraEffects.h:48

References EventProcessor::AddEvent(), EventProcessor::CalculateQueueTime(), CastCustomSpell(), CONFIG_MUNCHING_BLIZZLIKE, AuraEffect::GetCasterGUID(), AuraEffect::GetEffIndex(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetOldAmount(), AuraEffect::GetTickNumber(), AuraEffect::GetTotalTicks(), m_Events, m_modAuras, SPELLVALUE_BASE_POINT0, sWorld, TRIGGERED_FULL_MASK, and TRIGGERED_NO_PERIODIC_RESET.

Referenced by HandleDummyAuraProc(), spell_mage_ignite::HandleProc(), spell_dru_t10_balance_4p_bonus::HandleProc(), spell_sha_t10_restoration_4p_bonus::HandleProc(), spell_sha_t8_electrified::HandleProc(), and HandleProcTriggerSpell().

◆ CastPetAura()

void Unit::CastPetAura ( PetAura const *  aura)
17225{
17226 uint32 auraId = aura->GetAura(GetEntry());
17227 if (!auraId)
17228 return;
17229
17230 if (auraId == 35696) // Demonic Knowledge
17231 {
17232 int32 basePoints = aura->GetDamage();
17233 CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true);
17234 }
17235 else
17236 CastSpell(this, auraId, true);
17237}

References CastCustomSpell(), CastSpell(), PetAura::GetAura(), PetAura::GetDamage(), and Object::GetEntry().

Referenced by Pet::CastPetAuras().

◆ CastSpell() [1/7]

SpellCastResult Unit::CastSpell ( float  x,
float  y,
float  z,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1250{
1251 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1252 if (!spellInfo)
1253 {
1254 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1256 }
1257
1258 SpellCastTargets targets;
1259 targets.SetDst(x, y, z, GetOrientation());
1260
1261 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1262}
void SetDst(float x, float y, float z, float orientation, uint32 mapId=MAPID_INVALID)
Definition: Spell.cpp:406

References CastSpell(), Object::GetGUID(), Position::GetOrientation(), LOG_ERROR, SpellCastTargets::SetDst(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [2/7]

SpellCastResult Unit::CastSpell ( GameObject go,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1265{
1266 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1267 if (!spellInfo)
1268 {
1269 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1271 }
1272
1273 SpellCastTargets targets;
1274 targets.SetGOTarget(go);
1275
1276 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1277}
void SetGOTarget(GameObject *target)
Definition: Spell.cpp:271

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetGOTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [3/7]

SpellCastResult Unit::CastSpell ( SpellCastTargets const &  targets,
SpellInfo const *  spellInfo,
CustomSpellValues const *  value,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
Todo:
: this is a workaround - not needed anymore, but required for some scripts :(
1152{
1153 if (!spellInfo)
1154 {
1155 LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster {}", GetGUID().ToString());
1157 }
1158
1160 if (!originalCaster && triggeredByAura)
1161 {
1162 originalCaster = triggeredByAura->GetCasterGUID();
1163 }
1164
1165 Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster);
1166
1167 if (value)
1168 {
1169 for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr)
1170 {
1171 spell->SetSpellValue(itr->first, itr->second);
1172 }
1173 }
1174
1175 spell->m_CastItem = castItem;
1176 return spell->prepare(&targets, triggeredByAura);
1177}
void SetSpellValue(SpellValueMod mod, int32 value)
Definition: Spell.cpp:8422
Item * m_CastItem
Definition: Spell.h:521

References AuraEffect::GetCasterGUID(), Object::GetGUID(), LOG_ERROR, Spell::m_CastItem, Spell::prepare(), Spell::SetSpellValue(), SPELL_FAILED_SPELL_UNAVAILABLE, and Position::ToString().

Referenced by Player::_addSpell(), Player::_addTalentAurasAndSpells(), Spell::_cast(), _ExitVehicle(), Player::_LoadGlyphAuras(), Battleground::_ProcessResurrect(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_rog_cheat_death::Absorb(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), Player::ActivateSpec(), spell_halion_combustion_consumption_aura::AddMarkStack(), Battleground::AddPlayer(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), BattlegroundMap::AddPlayerToMap(), Battleground::AddPlayerToResurrectQueue(), Pet::addSpell(), spell_dru_barkskin::AfterApply(), spell_dru_savage_roar_aura::AfterApply(), spell_astromancer_wrath_of_the_astromancer::AfterRemove(), spell_gen_lifebloom::AfterRemove(), spell_oculus_stop_time_aura::Apply(), spell_sha_earthbind_totem::Apply(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyEnchantment(), spell_hun_lock_and_load::ApplyMarker(), npc_mograine::npc_mograineAI::AshbringerEvent(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::boss_yoggsaron_crusher_tentacleAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::boss_yoggsaron_death_orbAI(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::boss_yoggsaron_influence_tentacleAI(), Player::BuildPlayerRepop(), spell_igb_incinerating_blast::CalculateDamage(), spell_igb_cannon_blast::CalculatePower(), npc_echo_of_medivh::CastChangeFacing(), npc_chesspiece::CastChangeFacing(), CastCustomSpell(), npc_hallows_end_soh::CastFires(), Player::CastItemCombatSpell(), npc_volatile_ooze::npc_volatile_oozeAI::CastMainSpell(), CastPetAura(), boss_mor_grayhoof::CastRandomSpell(), GameObject::CastSpell(), CastSpell(), spell_the_lich_king_defile::ChangeDamageAndGrow(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), spell_eredar_twins_handle_touch::CheckCast(), Spell::CheckItems(), spell_botanica_shift_form_aura::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), spell_the_lich_king_shadow_trap_periodic::CheckTargetCount(), spell_dk_raise_dead::ConsumeReagents(), spell_frost_giant_death_plague::CountTargets(), instance_blackrock_spire::instance_blackrock_spireMapScript::CreatureLooted(), violet_hold_trashAI::CreatureStartAttackDoor(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_illidan_stormrage::boss_illidan_stormrageAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), DealMeleeDamage(), spell_warl_seed_of_corruption_aura::Detonate(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_twin_valkyrAI::DoAction(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_icc_severed_essence::npc_icc_severed_essenceAI::DoAction(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), npc_eris_hevenfire::npc_eris_hevenfireAI::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_flame_leviathan::boss_flame_leviathanAI::DoAction(), boss_magtheridon::DoAction(), boss_sacrolash::boss_sacrolashAI::DoAction(), boss_alythess::boss_alythessAI::DoAction(), boss_kalecgos::boss_kalecgosAI::DoAction(), boss_sathrovarr::boss_sathrovarrAI::DoAction(), npc_kalecgos_kj::npc_kalecgos_kjAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_black_knight::boss_black_knightAI::DoAction(), boss_jormungarAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_icc_blood_beast::npc_icc_blood_beastAI::DoAction(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_molten_golem::npc_molten_golemAI::DoAction(), boss_steelbreaker::boss_steelbreakerAI::DoAction(), npc_ulduar_bot_summon_trigger::npc_ulduar_bot_summon_triggerAI::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DoAction(), boss_yoggsaron_keeper::DoAction(), boss_illidari_council_memberAI::DoAction(), Spell::DoAllEffectOnTarget(), UnitAI::DoCast(), UnitAI::DoCastAOE(), ScriptedAI::DoCastSpell(), InstanceScript::DoCastSpellOnPlayer(), InstanceScript::DoCastSpellOnPlayers(), UnitAI::DoCastToAllHostilePlayers(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), npc_midsummer_ribbon_pole_target::DoFireworkChecks(), npc_midsummer_ribbon_pole_target::DoGroundFlowerChecks(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), npc_midsummer_ribbon_pole_target::DoSpewLavaChecks(), boss_skeram::DoTeleport(), Spell::DoTriggersOnSpellHit(), Player::DuelComplete(), Spell::EffectActivateRune(), Spell::EffectApplyGlyph(), Spell::EffectCastButtons(), Spell::EffectDummy(), Spell::EffectEnergize(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectInebriate(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectStuck(), Spell::EffectSummonType(), Spell::EffectTaunt(), Spell::EffectTeleportUnits(), Spell::EffectTitanGrip(), Spell::EffectTriggerMissileSpell(), Spell::EffectTriggerRitualOfSummoning(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::EmpowerCultist(), boss_the_lich_king::boss_the_lich_kingAI::EnterEvadeMode(), boss_zuljin::boss_zuljinAI::EnterPhase(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundEY::EventTeamCapturedPoint(), BattleExperienceEvent::Execute(), OrcDeathEvent::Execute(), CastArmageddon::Execute(), UtherBatteredHiltEvent::Execute(), ShockVortexExplodeEvent::Execute(), ResetEncounterEvent::Execute(), FrostBombExplosion::Execute(), IceTombSummonEvent::Execute(), VileSpiritActivateEvent::Execute(), LichKingMovieEvent::Execute(), DelayedCastEvent::Execute(), DelayedCastMincharEvent::Execute(), ChargeRifts::Execute(), CosmicSmashDamageEvent::Execute(), CastRunesEvent::Execute(), BoomEvent::Execute(), SACActivateEvent::Execute(), VerasEnvenom::Execute(), CastQuill::Execute(), lapseTeleport::Execute(), boss_salramm::boss_salrammAI::ExplodeGhoul(), spell_festergut_blighted_spores_aura::ExtraEffect(), spell_rotface_mutated_infection_aura::ExtraRemoveEffect(), npc_dark_iron_attack_generator::FinishAttackDueToWin(), npc_azure_saboteur::npc_azure_saboteurAI::FinishPointReached(), boss_janalai::boss_janalaiAI::FireWall(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::GoSiphon(), go_soulwell::go_soulwellAI::GossipHello(), spell_cataclysm_breath::HandleAfterCast(), spell_dk_chains_of_ice::HandleAfterCast(), spell_mage_arcane_blast::HandleAfterCast(), spell_q13086_last_line_of_defence::HandleAfterCast(), spell_infected_worgen_bite_aura::HandleAfterEffectApply(), spell_dk_blood_boil::HandleAfterHit(), spell_dk_scourge_strike::HandleAfterHit(), spell_rog_deadly_poison::HandleAfterHit(), spell_warlords_rage::HandleAfterRemove(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_felmyst_fog_of_corruption_charm_aura::HandleApply(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleApply(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), spell_dru_enrage::HandleApply(), spell_rog_killing_spree_aura::HandleApply(), spell_warr_vigilance::HandleApply(), spell_azjol_nerub_pound::HandleApplyAura(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_dk_death_grip::HandleBaseDummy(), misc_commandscript::HandleBindSightCommand(), spell_rotface_unstable_ooze_explosion_init::HandleCast(), spell_commander_sarannis_summon_reinforcements::HandleCast(), cast_commandscript::HandleCastBackCommand(), cast_commandscript::HandleCastCommand(), cast_commandscript::HandleCastDestCommand(), cast_commandscript::HandleCastDistCommand(), cast_commandscript::HandleCastSelfCommand(), cast_commandscript::HandleCastTargetCommad(), spell_gen_mounted_charge::HandleChargeEffect(), spell_dk_corpse_explosion::HandleCorpseExplosion(), OutdoorPvPSI::HandleCustomSpell(), WorldSession::HandleDuelCancelledOpcode(), spell_icc_shattered_bones::HandleDummy(), spell_corrupted_totems::HandleDummy(), spell_moroes_vanish::HandleDummy(), spell_karazhan_blink::HandleDummy(), spell_ooze_zap::HandleDummy(), spell_saviana_conflagration_init::HandleDummy(), spell_igb_burning_pitch_selector::HandleDummy(), spell_igb_burning_pitch::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_anti_air_rocket_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_illidan_found_target::HandleDummy(), spell_leotheras_chaos_blast::HandleDummy(), spell_morogrim_tidewalker_watery_grave::HandleDummy(), spell_q10935_the_exorcism_of_colonel_jules::HandleDummy(), spell_gen_focused_bursts::HandleDummy(), spell_shadowblink::HandleDummy(), spell_spawn_drakonid::HandleDummy(), spell_send_mug_target_picker::HandleDummy(), spell_hallows_end_candy::HandleDummy(), spell_hallows_end_bucket_lands::HandleDummy(), spell_midsummer_torch_catch::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_mana_burn_area::HandleDummy(), spell_voljin_war_drums::HandleDummy(), spell_voodoo::HandleDummy(), spell_sartharion_lava_strike::HandleDummy(), spell_halion_meteor_strike_targeting::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_drakkari_colossus_emerge::HandleDummy(), spell_drakkari_colossus_surge::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_voa_flaming_cinder::spell_voa_flaming_cinder_SpellScript::HandleDummy(), spell_q12096_q12092_dummy::HandleDummy(), spell_vehicle_warhead_fuse::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_najentus_needle_spine::HandleDummy(), spell_ice_spear_target_picker::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), spell_gen_cannibalize::HandleDummy(), spell_gen_gadgetzan_transporter_backfire::HandleDummy(), spell_gen_gnomish_transporter::HandleDummy(), spell_hun_masters_call::HandleDummy(), spell_hun_pet_carrion_feeder::HandleDummy(), spell_item_gnomish_universal_remote::HandleDummy(), spell_item_gnomish_shrink_ray::HandleDummy(), spell_item_trigger_spell::HandleDummy(), spell_item_deviate_fish::HandleDummy(), spell_item_flask_of_the_north::HandleDummy(), spell_item_make_a_wish::HandleDummy(), spell_item_mingos_fortune_generator::HandleDummy(), spell_item_net_o_matic::HandleDummy(), spell_item_noggenfogger_elixir::HandleDummy(), spell_item_savory_deviate_delight::HandleDummy(), spell_item_six_demon_bag::HandleDummy(), spell_item_underbelly_elixir::HandleDummy(), spell_item_vanquished_clutches::HandleDummy(), spell_item_purify_helboar_meat::HandleDummy(), spell_item_reindeer_transformation::HandleDummy(), spell_item_nigh_invulnerability::HandleDummy(), spell_item_poultryizer::HandleDummy(), spell_item_socrethars_stone::HandleDummy(), spell_item_demon_broiled_surprise::HandleDummy(), spell_item_complete_raptor_capture::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_nitro_boots::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_item_rocket_boots::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_item_greatmothers_soulcatcher::HandleDummy(), spell_mage_summon_water_elemental::HandleDummy(), spell_pal_blessing_of_faith::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pal_judgement_of_command::HandleDummy(), spell_pri_penance::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q5206_test_fetid_skull::HandleDummy(), spell_q11396_11399_scourging_crystal_controller::HandleDummy(), spell_q11587_arcane_prisoner_rescue::HandleDummy(), spell_q11730_ultrasonic_screwdriver::HandleDummy(), spell_q12634_despawn_fruit_tosser::HandleDummy(), spell_q12683_take_sputum_sample::HandleDummy(), spell_q12937_relief_for_the_fallen::HandleDummy(), spell_q9452_cast_net::HandleDummy(), spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy::HandleDummy(), spell_q12308_escape_from_silverbrook::HandleDummy(), spell_q12641_death_comes_from_on_high::HandleDummy(), spell_rog_shiv::HandleDummy(), spell_sha_fire_nova::HandleDummy(), spell_warl_ritual_of_doom_effect::HandleDummy(), spell_warl_soulshatter::HandleDummy(), spell_warr_charge::HandleDummy(), spell_magtheridon_shadow_grasp::HandleDummyApply(), HandleDummyAuraProc(), spell_yogg_saron_destabilization_matrix::HandleDummyEffect(), spell_yogg_saron_insane_periodic_trigger::HandleDummyEffect(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_talon_king_ikiss_blink::HandleDummyHitTarget(), spell_shadowfang_keep_forsaken_skills::spell_shadowfang_keep_forsaken_skills_AuraScript::HandleDummyTick(), spell_item_rocket_chicken::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_shadowfang_keep_haunting_spirits::spell_shadowfang_keep_haunting_spirits_AuraScript::HandleDummyTick(), spell_blood_council_shadow_prison_aura::HandleDummyTick(), spell_mark_of_nature::HandleEffect(), spell_target_fissures::HandleEffect(), spell_rog_vanish::HandleEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_midsummer_ribbon_pole::HandleEffectApply(), spell_tharon_ja_dummy_aura::HandleEffectApply(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_leotheras_insidious_whisper_aura::HandleEffectApply(), spell_serpentshrine_cavern_coilfang_water::HandleEffectApply(), spell_q12851_going_bearback::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic(), spell_rog_killing_spree_aura::HandleEffectPeriodic(), spell_sha_earthbind_totem::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_warr_retaliation::HandleEffectProc(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_trigger_aura::HandleEffectRemove(), spell_teron_gorefiend_shadow_of_death::HandleEffectRemove(), spell_black_temple_skeleton_shot_aura::HandleEffectRemove(), spell_hydross_cleansing_field_command::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite_trigger_aura::HandleEffectRemove(), spell_q10930_big_bone_worm_aura::HandleEffectRemove(), spell_q10929_fumping_aura::HandleEffectRemove(), spell_flamewreath::HandleFinish(), spell_midsummer_fling_torch::HandleFinish(), spell_midsummer_juggling_torch::HandleFinish(), spell_wintergrasp_rp_gg::HandleFinish(), spell_dreamwalker_summoner::HandleForceCast(), spell_dreamwalker_summon_suppresser_effect::HandleForceCast(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), OPvPCapturePointZM_GraveYard::HandleGossipOption(), spell_item_crazy_alchemists_potion::HandleHeal(), spell_magtheridon_quake::HandleHit(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundIC::HandleKillUnit(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_ticking_time_bomb_aura::HandleOnEffectRemove(), spell_delusions_of_jindo::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), spell_mark_of_frost_freeze::HandleOnHit(), spell_mutate_explode_bug::HandleOnHit(), spell_explode_trigger::HandleOnHit(), spell_blade_dance_targeting::HandleOnHit(), HandleOverrideClassScriptAuraProc(), aura_class_call_wild_magic::HandlePeriodic(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_halion_meteor_strike_spread_aura::HandlePeriodic(), spell_sladran_grip_of_sladran_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_close_rift_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_rancid_spore_cloud::HandlePeriodic(), spell_kaelthas_remote_toy::HandlePeriodic(), spell_q10923_evil_draws_near_periodic_aura::HandlePeriodic(), spell_sha_totemic_mastery::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_kiljaeden_shadow_spike_aura::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), spell_halion_twilight_cutter_periodic_aura::HandlePeriodic(), spell_oculus_ride_ruby_emerald_amber_drake_que_aura::HandlePeriodic(), spell_hun_sniper_training::HandlePeriodic(), spell_shadow_bolt_whirl::HandlePeriodic(), spell_voa_overcharge::spell_voa_overcharge_AuraScript::HandlePeriodicDummy(), AuraEffect::HandlePeriodicDummyAuraTick(), spell_magtheridon_shadow_grasp::HandlePeriodicRemove(), spell_igb_periodic_trigger_with_power_cost_aura::HandlePeriodicTick(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), spell_bronjahm_soulstorm_channel_ooc_aura::HandlePeriodicTick(), spell_bronjahm_soulstorm_visual_aura::HandlePeriodicTick(), spell_item_direbrew_remote_aura::HandlePeriodicTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceMoveByAI(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), BattlegroundIC::HandlePlayerResurrect(), misc_commandscript::HandlePossessCommand(), spell_blood_queen_vampiric_bite::HandlePresence(), spell_mark_of_malice::HandleProc(), spell_item_lil_phylactery::HandleProc(), spell_item_fate_rune_of_unsurpassed_vigor::HandleProc(), spell_mage_burning_determination::HandleProc(), spell_rog_tricks_of_the_trade::HandleProc(), spell_gyth_chromatic_protection::HandleProc(), spell_ahune_spanky_hands::HandleProc(), spell_item_trauma::HandleProc(), spell_item_shadows_fate::HandleProc(), spell_utgarde_pinnacle_beast_mark::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_hun_improved_mend_pet::HandleProc(), spell_hun_misdirection::HandleProc(), spell_item_aegis_of_preservation::HandleProc(), spell_item_desperate_defense::HandleProc(), spell_mage_focus_magic::HandleProc(), spell_pal_blessing_of_sanctuary::HandleProc(), spell_pri_item_greater_heal_refund::HandleProc(), spell_pri_mana_leech::HandleProc(), spell_sha_item_lightning_shield_trigger::HandleProc(), spell_warr_vigilance::HandleProc(), spell_karazhan_temptation::HandleProc(), spell_dk_blood_caked_blade::HandleProc(), spell_dk_dancing_rune_weapon::HandleProc(), spell_gen_adaptive_warding::HandleProc(), spell_gen_moss_covered_feet::HandleProc(), spell_item_unsated_craving::HandleProc(), spell_item_shadowmourne::HandleProc(), spell_sha_item_lightning_shield::HandleProc(), spell_warl_glyph_of_shadowflame::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), spell_hun_lock_and_load::HandleProcs(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellAuraProc(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), AuraEffect::HandleRaidProcFromChargeAuraProc(), spell_dk_raise_dead::HandleRaiseDead(), spell_vael_burning_adrenaline::HandleRemove(), spell_kiljaeden_darkness_aura::HandleRemove(), spell_entropius_void_zone_visual_aura::HandleRemove(), spell_igb_rocket_pack_aura::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_gen_mine_sweeper::HandleSchoolDMG(), spell_warl_shadowflame::HandleSchoolDMG(), spell_gen_bandage::HandleScript(), spell_pal_lay_on_hands::HandleScript(), spell_kormok_summon_bone_mages::HandleScript(), spell_kormok_summon_bone_minions::HandleScript(), spell_energize_aoe::HandleScript(), spell_saviana_conflagration_throwback::HandleScript(), spell_taldaram_glittering_sparks::HandleScript(), spell_blood_queen_bloodbolt::HandleScript(), spell_blood_queen_presence_of_the_darkfallen::HandleScript(), spell_igb_rocket_artillery::HandleScript(), spell_putricide_unstable_experiment::HandleScript(), spell_sindragosa_icy_grip::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_summon_spirit_bomb::HandleScript(), spell_dreamwalker_summon_portal::HandleScript(), spell_dreamwalker_twisted_nightmares::HandleScript(), spell_archavon_rock_shards::spell_archavon_rock_shards_SpellScript::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_gen_create_lance::HandleScript(), spell_item_defibrillate::HandleScript(), spell_item_scroll_of_recall::HandleScript(), spell_shazzrah_gate_dummy::HandleScript(), spell_apothecary_lingering_fumes::HandleScript(), spell_apothecary_validate_area::HandleScript(), spell_apothecary_throw_cologne::HandleScript(), spell_apothecary_throw_perfume::HandleScript(), spell_hallows_end_trick::HandleScript(), spell_hallows_end_put_costume::HandleScript(), spell_hallows_end_trick_or_treat::HandleScript(), spell_winter_veil_mistletoe::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_moam_summon_mana_fiends::HandleScript(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), spell_mistress_kiss_area::spell_mistress_kiss_area_SpellScript::HandleScript(), spell_novos_summon_minions::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_choking_gas_bomb::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_the_lich_king_cast_back_to_caster::HandleScript(), spell_frost_giant_death_plague::HandleScript(), spell_yogg_saron_target_selectors::HandleScript(), spell_the_black_stalker_levitate::HandleScript(), spell_the_black_stalker_levitation_pulse::HandleScript(), spell_the_black_stalker_someone_grab_me::HandleScript(), spell_the_black_stalker_magnetic_pull::HandleScript(), spell_the_flag_of_ownership::HandleScript(), spell_gen_elune_candle::HandleScript(), spell_gen_teleporting::HandleScript(), spell_gen_dalaran_disguise::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), spell_item_eggnog::HandleScript(), spell_q12735_song_of_cleansing::HandleScript(), spell_q13011_bear_flank_master::HandleScript(), spell_q12619_emblazon_runeblade_effect::HandleScript(), spell_q12919_gymers_grab::HandleScript(), spell_q12919_gymers_throw::HandleScript(), spell_q12641_death_comes_from_on_high_summon_ghouls::spell_q12641_death_comes_from_on_high_summon_ghouls_SpellScript::HandleScriptEffect(), spell_kalecgos_spectral_realm_dummy::HandleScriptEffect(), spell_entropius_negative_energy::HandleScriptEffect(), spell_marrowgar_coldflame_bonestorm::HandleScriptEffect(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_black_temple_bloodbolt::HandleScriptEffect(), spell_lady_vashj_summon_sporebat::HandleScriptEffect(), spell_kaelthas_summon_weapons::HandleScriptEffect(), spell_kaelthas_gravity_lapse::HandleScriptEffect(), spell_kaelthas_nether_beam::HandleScriptEffect(), spell_gen_clone::HandleScriptEffect(), spell_gen_clone_weapon::HandleScriptEffect(), spell_gen_break_shield::HandleScriptEffect(), spell_gen_mounted_charge::HandleScriptEffect(), spell_gen_throw_shield::HandleScriptEffect(), spell_item_sleepy_willy::HandleScriptEffect(), spell_item_lil_xt::HandleScriptEffect(), spell_q12698_the_gift_that_keeps_on_giving::spell_q12698_the_gift_that_keeps_on_giving_SpellScript::HandleScriptEffect(), spell_death_knight_initiate_visual::HandleScriptEffect(), spell_q12779_an_end_to_all_things::HandleScriptEffect(), spell_brewfest_toss_mug::HandleScriptEffect(), spell_direbrew_summon_mole_machine_target_picker::HandleScriptEffect(), spell_request_second_mug::HandleScriptEffect(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), spell_dtk_summon_random_drakkari::HandleScriptEffect(), spell_marrowgar_coldflame::HandleScriptEffect(), spell_arcane_chains_character_force_cast::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), spell_black_temple_summon_shadowfiends::HandleScriptEffect(), spell_ice_bombardment_dest_picker::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_hun_masters_call::HandleScriptEffect(), spell_item_mirrens_drinking_hat::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), spell_q1846_bending_shinbone::HandleScriptEffect(), spell_q14112_14145_chum_the_water::HandleScriptEffect(), WorldSession::HandleSelfResOpcode(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), HandleSpellClick(), spell_marrowgar_bone_spike_graveyard::HandleSpikes(), AuraEffect::HandleSpiritOfRedemption(), spell_gen_paralytic_poison::HandleStun(), spell_putricide_mutated_transformation::HandleSummon(), spell_item_draenic_pale_ale::HandleSummon(), WorldSession::HandleTalentWipeConfirmOpcode(), spell_mother_shahraz_fatal_attraction::HandleTeleportUnits(), spell_warl_drain_soul::HandleTick(), WorldSession::HandleTrainerBuySpellOpcode(), spell_trigger_spell_from_caster::HandleTrigger(), spell_magic_eater_food::HandleTriggerSpell(), spell_winter_veil_racer_rocket_slam::HandleTriggerSpell(), spell_pal_righteous_defense::HandleTriggerSpellHit(), boss_onyxia::HandleWhelpSpam(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), boss_ichoron::boss_ichoronAI::IchoronDoCastToAllHostilePlayers(), spell_q10769_dissension_amongst_the_ranks_aura::if(), CharmInfo::InitCharmCreateSpells(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InitFight(), boss_urok_doomhowl::boss_urok_doomhowlAI::InitializeAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::InitializeAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::InitializeAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::InitializeAI(), boss_gal_darah::boss_gal_darahAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), CharmInfo::InitPossessCreateSpells(), Guardian::InitStatsForLevel(), Totem::InitSummon(), boss_faction_championsAI::IsCCed(), npc_living_inferno::npc_living_infernoAI::IsSummonedBy(), TriggerAI::IsSummonedBy(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_bone_spike::npc_bone_spikeAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_pet_gen_fetch_ball::IsSummonedBy(), npc_kiljaeden_controller::npc_kiljaeden_controllerAI::JustDied(), npc_hallows_end_soh::JustDied(), boss_rajaxx::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_phantom_hallucination::npc_phantom_hallucinationAI::JustDied(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::JustDied(), boss_steelbreaker::boss_steelbreakerAI::JustDied(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_freya_summons::boss_freya_summonsAI::JustDied(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::JustDied(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::JustDied(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::JustDied(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::JustDied(), npc_ichor_globule::npc_ichor_globuleAI::JustDied(), boss_fathomguard_sharkkis::JustDied(), boss_fathomguard_tidalvess::JustDied(), boss_fathomguard_caribdis::JustDied(), CombatAI::JustDied(), npc_high_inquisitor_valroth::npc_high_inquisitor_valrothAI::JustDied(), boss_brutallus::boss_brutallusAI::JustDied(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), boss_sapphiron::boss_sapphironAI::JustDied(), boss_anomalus::boss_anomalusAI::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_shade_of_akama::JustDied(), CasterAI::JustEngagedWith(), boss_servant_quarters::JustEngagedWith(), npc_mograine::npc_mograineAI::JustEngagedWith(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::JustEngagedWith(), npc_hallows_end_soh::JustEngagedWith(), boss_eadric::boss_eadricAI::JustEngagedWith(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustEngagedWith(), boss_twin_valkyrAI::JustEngagedWith(), boss_garfrost::boss_garfrostAI::JustEngagedWith(), npc_stinky_icc::npc_stinky_iccAI::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), npc_rimefang::npc_rimefangAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_freya_summons::boss_freya_summonsAI::JustEngagedWith(), boss_vezax::boss_vezaxAI::JustEngagedWith(), boss_hodir::boss_hodirAI::JustEngagedWith(), boss_thorim::boss_thorimAI::JustEngagedWith(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustEngagedWith(), boss_koralon::boss_koralonAI::JustEngagedWith(), boss_toravon::boss_toravonAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustEngagedWith(), boss_moragg::boss_moraggAI::JustEngagedWith(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::JustEngagedWith(), boss_watchkeeper_gargolmar::JustEngagedWith(), boss_gatewatcher_gyrokill::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), CombatAI::JustEngagedWith(), boss_ellris_duskhallow::JustEngagedWith(), boss_warlord_salaris::JustEngagedWith(), boss_garaxxas::JustEngagedWith(), boss_muru::boss_muruAI::JustEngagedWith(), boss_yauj::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_moorabi::boss_moorabiAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), boss_sapphiron::boss_sapphironAI::JustEngagedWith(), boss_keristrasza::boss_keristraszaAI::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_fathomlord_karathress::JustEngagedWith(), boss_fathomguard_sharkkis::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustReachedHome(), boss_bronjahm::boss_bronjahmAI::JustReachedHome(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustReachedHome(), boss_gal_darah::boss_gal_darahAI::JustReachedHome(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::JustReachedHome(), boss_freya::boss_freyaAI::JustSummoned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_skeram::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_ragnaros::boss_ragnarosAI::JustSummoned(), boss_vexallus::JustSummoned(), boss_kiljaeden::boss_kiljaedenAI::JustSummoned(), npc_kalecgos_kj::npc_kalecgos_kjAI::JustSummoned(), boss_jindo::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_taldaram::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_gal_darah::boss_gal_darahAI::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::JustSummoned(), boss_malygos::boss_malygosAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_svala::boss_svalaAI::JustSummoned(), boss_shirrak_the_dead_watcher::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), boss_grandmaster_vorpil::JustSummoned(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::JustSummoned(), boss_illidan_stormrage::boss_illidan_stormrageAI::JustSummoned(), boss_veras_darkshadow::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_supremus::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::JustSummoned(), boss_ayamiss::JustSummoned(), Kill(), boss_azuregos::boss_azuregosAI::KilledUnit(), boss_anubrekhan::boss_anubrekhanAI::KilledUnit(), boss_doomwalker::KilledUnit(), npc_dark_iron_guzzler::KilledUnit(), boss_steelbreaker::boss_steelbreakerAI::KilledUnit(), emerald_dragonAI::KilledUnit(), boss_emeriss::boss_emerissAI::KilledUnit(), boss_felblood_kaelthas::LapseAction(), spell_mandokir_charge::LaunchHit(), Player::learnQuestRewardedSpells(), spell_taldaram_summon_flame_ball::Load(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), boss_temporus::MoveInLineOfSight(), npc_medivh_bm::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_spirit_shade::npc_spirit_shadeAI::MovementInform(), boss_selin_fireheart::MovementInform(), npc_unworthy_initiate::npc_unworthy_initiateAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_eck::boss_eckAI::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), boss_malygos::boss_malygosAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::MovementInform(), boss_headless_horseman::MovementInform(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::MovementInform(), npc_ashtongue_sorcerer::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), boss_kagani_nightstrike::MovementInform(), npc_dark_iron_guzzler::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_assembly_lightning::npc_assembly_lightningAI::MovementInform(), boss_ymiron::boss_ymironAI::MovementInform(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), BattlegroundAB::NodeOccupied(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::npc_algalon_worm_holeAI(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_frost_tomb::npc_frost_tombAI::npc_frost_tombAI(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_midsummer_torch_target::npc_midsummer_torch_target(), npc_power_spark::npc_power_sparkAI::npc_power_sparkAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::npc_ulduar_iron_constructAI(), npc_ulduar_toasty_fire::npc_ulduar_toasty_fireAI::npc_ulduar_toasty_fireAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), spell_shadowfang_keep_forsaken_skills::spell_shadowfang_keep_forsaken_skills_AuraScript::OnApply(), spell_direbrew_disarm::OnApply(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_halion_combustion_consumption_aura::OnApply(), spell_load_into_catapult_aura::OnApply(), spell_gen_damage_reduction_aura::OnApply(), spell_gruul_ground_slam_trigger::OnApply(), spell_hun_ascpect_of_the_viper::OnApply(), spell_hun_viper_attack_speed::OnApply(), spell_item_with_mount_speed::OnApply(), spell_blood_queen_vampiric_bite::OnCast(), npc_chesspiece::OnCharmed(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_item_linken_boomerang::OnEffectLaunchTargetDisarm(), spell_item_linken_boomerang::OnEffectLaunchTargetStun(), npc_essence_of_twin::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_noblegarden_colored_egg::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_orb_of_domination::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_strange_pool::OnGossipHello(), go_simon_cluster::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), npc_steward_of_time::OnGossipSelect(), npc_iruk::OnGossipSelect(), npc_zephyr::OnGossipSelect(), npc_taxi::OnGossipSelect(), npc_locksmith::OnGossipSelect(), npc_engineering_tele_trinket::OnGossipSelect(), npc_sayge::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), boss_gloomrel::OnGossipSelect(), npc_death_knight_initiate::OnGossipSelect(), npc_parqual_fintallas::OnGossipSelect(), npcs_riverbreeze_and_silversky::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_avatar_of_freya::OnGossipSelect(), npc_adventurous_dwarf::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_wormhole::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), go_fel_crystalforge::OnGossipSelect(), go_bashir_crystalforge::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), Player::OnGossipSelect(), lfg::LFGPlayerScript::OnMapChanged(), spell_apothecary_perfume_spill::OnPeriodic(), spell_apothecary_cologne_spill::OnPeriodic(), spell_muru_summon_blood_elves_periodic_aura::OnPeriodic(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_anubisath_mortal_strike::OnPeriodic(), spell_the_lich_king_soul_reaper_aura::OnPeriodic(), spell_yogg_saron_brain_link_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_illidan_tear_of_azzinoth_summon_channel_aura::OnPeriodic(), spell_illidan_demon_transform1_aura::OnPeriodic(), spell_illidan_cage_trap_stun_aura::OnPeriodic(), spell_black_temple_dementia_aura::OnPeriodic(), spell_npc22275_crystal_prison_aura::OnPeriodic(), spell_item_eye_of_grillok_aura::OnPeriodic(), spell_muru_darkness_aura::OnPeriodic(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_the_lich_king_vile_spirits_aura::OnPeriodic(), spell_web_wrap_damage::OnPeriodic(), spell_assembly_rune_of_summoning_aura::OnPeriodic(), spell_thorim_lightning_pillar_P2_aura::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), spell_karathress_power_of_tidalvess::OnPeriodic(), spell_karathress_power_of_caribdis::OnPeriodic(), spell_leotheras_demon_link::OnPeriodic(), spell_lurker_below_spout::OnPeriodic(), spell_gen_periodic_knock_away::OnPeriodic(), spell_gen_turkey_marker::OnPeriodic(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnPlayerInWaterStateUpdate(), BattlefieldWG::OnPlayerJoinWar(), spell_gen_obsidian_armor::OnProc(), npc_steward_of_time::OnQuestAccept(), npc_mikhail::OnQuestAccept(), npc_rocknot::OnQuestReward(), npc_thrall_bfu::OnQuestReward(), spell_kalecgos_spectral_realm_aura::OnRemove(), spell_azgalor_doom_aura::OnRemove(), spell_boss_salramm_steal_flesh_aura::OnRemove(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_putricide_mutation_init_aura::OnRemove(), spell_the_lich_king_shadow_trap_visual_aura::OnRemove(), spell_the_lich_king_harvest_soul_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_ioc_repair_turret_aura::OnRemove(), spell_kaelthas_flame_strike::OnRemove(), spell_item_goblin_weather_machine_aura::OnRemove(), spell_warl_curse_of_doom::OnRemove(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), spell_item_shadowmourne_soul_fragment::OnStackChange(), at_hor_battered_hilt_throw::OnTrigger(), at_frozen_throne_teleport::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), MidsummerPlayerScript::OnUpdateZone(), npc_wintergarde_gryphon::PassengerBoarded(), npc_four_car_garage::npc_four_car_garageAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), spell_quest_test_flight_charging::PerformKick(), spell_send_mug_control_aura::PeriodicTick(), spell_barreled_control_aura::PeriodicTick(), spell_dreamwalker_summon_suppresser_aura::PeriodicTick(), spell_summon_ice_spear_delayer::PeriodicTick(), spell_summoning_rhyme_aura::PeriodicTick(), spell_halion_twilight_phasing::Phase(), Battlefield::PlayerAskToLeave(), BattlegroundAV::PopulateNode(), spell_azjol_nerub_carrion_beetels::PrepareAuraScript(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11653_youre_not_so_big_now::PrepareSpellScript(), spell_q13369_fate_up_against_your_will::PrepareSpellScript(), SmartScript::ProcessAction(), ProcessCastaction(), Player::ProcessDelayedOperations(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), ProcessTerrainStatusUpdate(), ProcessUnlearnAction(), BattlefieldWG::PromotePlayer(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), spell_gen_defend::RefreshVisualShields(), Vehicle::RemovePassenger(), spell_igb_below_zero::RemovePassengers(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), Player::ReportedAfkBy(), GuardAI::Reset(), boss_brutallus::boss_brutallusAI::Reset(), boss_sacrolash::boss_sacrolashAI::Reset(), boss_alythess::boss_alythessAI::Reset(), npc_demonic_vapor::npc_demonic_vaporAI::Reset(), npc_demonic_vapor_trail::npc_demonic_vapor_trailAI::Reset(), boss_kalec::boss_kalecAI::Reset(), boss_sathrovarr::boss_sathrovarrAI::Reset(), npc_kiljaeden_controller::npc_kiljaeden_controllerAI::Reset(), npc_singularity::npc_singularityAI::Reset(), npc_batrider::Reset(), npc_dark_iron_guzzler::Reset(), boss_headless_horseman_pumpkin::Reset(), npc_taretha::npc_tarethaAI::Reset(), npc_medivh_bm::Reset(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_nerubian_burrower::npc_nerubian_burrowerAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_elemental::boss_drakkari_elementalAI::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_anomalus::boss_anomalusAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_freya_lifebinder::boss_freya_lifebinderAI::Reset(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::Reset(), boss_freya_nature_bomb::boss_freya_nature_bombAI::Reset(), boss_thorim_lightning_orb::boss_thorim_lightning_orbAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::Reset(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_yoggsaron_voice::boss_yoggsaron_voiceAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_frozen_orb::npc_frozen_orbAI::Reset(), npc_frozen_orb_stalker::npc_frozen_orb_stalkerAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::Reset(), npc_storm_cloud::npc_storm_cloudAI::Reset(), boss_illidan_stormrage::boss_illidan_stormrageAI::Reset(), npc_ashtongue_channeler::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), boss_wrath_scryer_soccothrates::Reset(), npc_training_dummy::npc_training_dummyAI::Reset(), BfGraveyard::Resurrect(), Resurrect(), Player::ResurrectPlayer(), Player::RewardQuest(), boss_bjarngrim::boss_bjarngrimAI::RollStance(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), Map::ScriptsProcess(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_sayge::SendAction(), go_skull_pile::SendActionMenu(), npc_xt002_heart::npc_xt002_heartAI::SendEnergyToCorner(), Player::SendInitialPacketsAfterAddToMap(), Player::SendQuestUpdate(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), npc_eastvale_peasent::SetData(), SetModelVisible(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_brewfest_keg_reciver::sGossipSelect(), npc_cairne_bloodhoof::npc_cairne_bloodhoofAI::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_zuljin::boss_zuljinAI::SpawnAdds(), boss_skadi_grauf::boss_skadi_graufAI::SpawnFlameTriggers(), boss_malchezaar::SpawnInfernal(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), boss_eadric::boss_eadricAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_ichor_globule::npc_ichor_globuleAI::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_franklin::npc_franklinAI::SpellHit(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_headless_horseman::SpellHit(), boss_thorim_pillar::boss_thorim_pillarAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_living_constellation::npc_living_constellationAI::SpellHit(), boss_ignis::boss_ignisAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_storm_cloud::npc_storm_cloudAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_midsummer_torch_target::SpellHit(), boss_magus_telestra::boss_magus_telestraAI::SpellHit(), boss_thorim::boss_thorimAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_bronjahm::boss_bronjahmAI::SpellHitTarget(), npc_demonic_vapor_trail::npc_demonic_vapor_trailAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_rotface::boss_rotfaceAI::SpellHitTarget(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), boss_hodir::boss_hodirAI::SpellHitTarget(), npc_ulduar_rocket_strike_trigger::npc_ulduar_rocket_strike_triggerAI::SpellHitTarget(), npc_q24545_lich_king::npc_q24545_lich_kingAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), boss_epoch::boss_epochAI::SpellHitTarget(), boss_sapphiron::boss_sapphironAI::SpellHitTarget(), boss_skadi_grauf::boss_skadi_graufAI::SpellHitTarget(), boss_shirrak_the_dead_watcher::SpellHitTarget(), npc_pet_gen_soul_trader_beacon::SpellHitTarget(), Battleground::SpiritOfCompetitionEvent(), boss_ionar::boss_ionarAI::Split(), boss_heigan::boss_heiganAI::StartFightPhase(), npc_finklestein::npc_finklesteinAI::StartNextTask(), Player::StoreItem(), spell_dk_ghoul_explode::Suicide(), boss_anzu::SummonBroods(), boss_anubrekhan::boss_anubrekhanAI::SummonedCreatureDies(), boss_cthun::SummonedCreatureDies(), boss_vexallus::SummonedCreatureDies(), boss_paletress::boss_paletressAI::SummonMemory(), go_wind_stone::go_wind_stoneAI::SummonNPC(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), spell_igb_check_for_players::TeleportPlayer(), BattlegroundSA::TeleportToEntrancePosition(), spell_midsummer_fling_torch::ThrowNextTorch(), TriggerBurningPitch(), npc_orb_carrier::npc_orb_carrierAI::TriggerCutter(), spell_koralon_meteor_fists::spell_koralon_meteor_fists_AuraScript::TriggerFists(), spell_flame_warder_meteor_fists::spell_flame_warder_meteor_fists_AuraScript::TriggerFists(), spell_gen_holiday_buff_food::TriggerFoodBuff(), spell_karazhan_brittle_bones_aura::Update(), spell_black_temple_curse_of_the_bleakheart_aura::Update(), spell_illidari_council_deadly_strike_aura::Update(), spell_mother_shahraz_random_periodic_aura::Update(), spell_mother_shahraz_beam_periodic_aura::Update(), spell_mother_shahraz_saber_lash_aura::Update(), spell_black_temple_charge_rage_aura::Update(), Pet::Update(), GameObject::Update(), TotemAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_image_of_medivh::npc_image_of_medivhAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_priestess_delrissa::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), boss_ellris_duskhallow::UpdateAI(), boss_eramas_brightblaze::UpdateAI(), boss_yazzai::UpdateAI(), boss_warlord_salaris::UpdateAI(), boss_garaxxas::UpdateAI(), boss_apoko::UpdateAI(), boss_zelfan::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_brutallus::boss_brutallusAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_sacrolash::boss_sacrolashAI::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), npc_demonic_vapor_trail::npc_demonic_vapor_trailAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_kalecgos_kj::npc_kalecgos_kjAI::UpdateAI(), boss_muru::boss_muruAI::UpdateAI(), boss_entropius::boss_entropiusAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_fenstalker::boss_fenstalkerAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), npc_hallows_end_train_fire::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_headless_horseman_head::UpdateAI(), boss_headless_horseman_pumpkin::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), npc_time_rift::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_tharnarian::npc_tharnarianAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_halion_controller::npc_halion_controllerAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_swarm_scarab::npc_swarm_scarabAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_druid::npc_toc_druidAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_paladin::npc_toc_paladinAI::UpdateAI(), npc_toc_priest::npc_toc_priestAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), npc_pos_icicle_trigger::npc_pos_icicle_triggerAI::UpdateAI(), npc_pos_collapsing_icicle::npc_pos_collapsing_icicleAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_anubrekhan::boss_anubrekhanAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::UpdateAI(), boss_heigan::boss_heiganAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_naxxramas_misc::boss_naxxramas_miscAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), npc_alexstrasza::npc_alexstraszaAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_ormorok::boss_ormorokAI::UpdateAI(), npc_crystal_spike::npc_crystal_spikeAI::UpdateAI(), npc_crystalline_frayer::npc_crystalline_frayerAI::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_freya_nature_bomb::boss_freya_nature_bombAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_saronite_animus::npc_ulduar_saronite_animusAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_icicle::npc_ulduar_icicleAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_proximity_mine::npc_ulduar_proximity_mineAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_keleseth::boss_kelesethAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_thassarian::npc_thassarianAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_jungle_punch_target::npc_jungle_punch_targetAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_queue::npc_wg_queueAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_veras_darkshadow::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_invis_infernal_caster::npc_invis_infernal_casterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), trigger_periodic::trigger_periodicAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_maexxna_webwrap::boss_maexxna_webwrapAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_q24545_vegard_dummy::npc_q24545_vegard_dummyAI::UpdateAI(), boss_illidari_council::UpdateAI(), Player::UpdateAreaDependentAuras(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_akama_illidan::npc_akama_illidanAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdatePhase(), Player::UpdateZoneDependentAuras(), GameObject::Use(), Player::VehicleSpellInitialize(), boss_bjarngrim::boss_bjarngrimAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_engineer_helice::npc_engineer_heliceAI::WaypointReached().

◆ CastSpell() [4/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1197{
1198 return CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1199}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [5/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1202{
1203 SpellCastTargets targets;
1204 targets.SetUnitTarget(victim);
1205 return CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster);
1206}

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastSpell() [6/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1180{
1181 return CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1182}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [7/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1185{
1186 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1187 if (!spellInfo)
1188 {
1189 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1191 }
1192
1193 return CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster);
1194}

References CastSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastStop()

◆ ChangeSeat()

void Unit::ChangeSeat ( int8  seatId,
bool  next = true 
)
19610{
19611 if (!m_vehicle)
19612 return;
19613
19614 if (seatId < 0)
19615 {
19616 seatId = m_vehicle->GetNextEmptySeat(GetTransSeat(), next);
19617 if (seatId < 0)
19618 return;
19619 }
19620 else if (seatId == GetTransSeat() || !m_vehicle->HasEmptySeat(seatId))
19621 return;
19622
19624 if (!m_vehicle->AddPassenger(this, seatId))
19625 ABORT();
19626}
int8 GetNextEmptySeat(int8 seatId, bool next) const
Definition: Vehicle.cpp:233
bool HasEmptySeat(int8 seatId) const
Definition: Vehicle.cpp:216

References ABORT, Vehicle::AddPassenger(), Vehicle::GetNextEmptySeat(), WorldObject::GetTransSeat(), Vehicle::HasEmptySeat(), m_vehicle, and Vehicle::RemovePassenger().

Referenced by _EnterVehicle(), and WorldSession::HandleChangeSeatsOnControlledVehicle().

◆ CleanupBeforeRemoveFromMap()

void Unit::CleanupBeforeRemoveFromMap ( bool  finalCleanup)
15656{
15658 return;
15659
15660 // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal
15662
15663 if (IsInWorld()) // not in world and not being removed atm
15665
15666 ASSERT(GetGUID());
15667
15668 // A unit may be in removelist and not in world, but it is still in grid
15669 // and may have some references during delete
15672
15673 if (finalCleanup)
15674 m_cleanupDone = true;
15675
15676 m_Events.KillAllEvents(false); // non-delatable (currently casted spells) will not deleted now but it will deleted at call in Map::RemoveAllObjectsInRemoveList
15677 CombatStop();
15682 GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
15683}
void KillAllEvents(bool force)
Definition: EventProcessor.cpp:82
void deleteReferences(bool removeFromMap=false)
Definition: HostileRefMgr.cpp:125
void ClearAllThreat()
Definition: ThreatMgr.cpp:417
void CombatStop(bool includingCast=false)
Definition: Unit.cpp:10367
void RemoveAllGameObjects()
Definition: Unit.cpp:6207
void ClearComboPoints()
Definition: Unit.cpp:16778
void ClearComboPointHolders()
Definition: Unit.cpp:16833
HostileRefMgr & getHostileRefMgr()
Definition: Unit.h:1491
void RemoveFromWorld() override
Definition: Unit.cpp:15609
void RemoveAllAuras()
Definition: Unit.cpp:5263
ThreatMgr & GetThreatMgr()
Definition: Unit.h:1487
void Clear(bool reset=true)
Definition: MotionMaster.h:165

References ASSERT, MotionMaster::Clear(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearComboPoints(), CombatStop(), HostileRefMgr::deleteReferences(), Object::GetGUID(), getHostileRefMgr(), GetMotionMaster(), GetThreatMgr(), InterruptNonMeleeSpells(), IsDuringRemoveFromWorld(), Object::IsInWorld(), EventProcessor::KillAllEvents(), m_cleanupDone, m_Events, RemoveAllAuras(), RemoveAllGameObjects(), and RemoveFromWorld().

Referenced by CleanupsBeforeDelete().

◆ CleanupsBeforeDelete()

void Unit::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

15686{
15687 if (GetTransport())
15688 {
15690 SetTransport(nullptr);
15693 }
15694
15695 CleanupBeforeRemoveFromMap(finalCleanup);
15696}
void RemoveMovementFlag(uint32 flag)
Definition: Object.h:331
void Reset()
Definition: Object.h:285
void SetTransport(Transport *t)
Definition: Object.h:605
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
void CleanupBeforeRemoveFromMap(bool finalCleanup)
Definition: Unit.cpp:15655

References CleanupBeforeRemoveFromMap(), WorldObject::GetTransport(), WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), MovementInfo::TransportInfo::Reset(), WorldObject::SetTransport(), and MovementInfo::transport.

Referenced by Player::CleanupsBeforeDelete(), npc_commandscript::HandleNpcAddCommand(), and Map::RemoveAllObjectsInRemoveList().

◆ ClearAllReactives()

void Unit::ClearAllReactives ( )
16842{
16843 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
16844 m_reactiveTimer[i] = 0;
16845
16852}
@ CLASS_CONTEXT_ABILITY_REACTIVE
Definition: UnitDefines.h:214
@ CLASS_HUNTER
Definition: SharedDefines.h:143
@ CLASS_WARRIOR
Definition: SharedDefines.h:141
@ AURA_STATE_DEFENSE
Definition: SharedDefines.h:1292
@ AURA_STATE_HUNTER_PARRY
Definition: SharedDefines.h:1298
virtual bool IsClass(Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
Definition: Unit.h:765
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition: Unit.cpp:10473

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), Object::IsPlayer(), m_reactiveTimer, MAX_REACTIVE, and ModifyAuraState().

Referenced by Player::ActivateSpec(), npc_mograine::npc_mograineAI::DamageTaken(), and setDeathState().

◆ ClearComboPointHolders()

void Unit::ClearComboPointHolders ( )
16834{
16835 while (!m_ComboPointHolders.empty())
16836 {
16837 (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders
16838 }
16839}

References ClearComboPoints(), and m_ComboPointHolders.

Referenced by CreatureAI::_EnterEvadeMode(), CleanupBeforeRemoveFromMap(), npc_mograine::npc_mograineAI::DamageTaken(), Player::RemoveFromWorld(), and setDeathState().

◆ ClearComboPoints()

void Unit::ClearComboPoints ( )
16779{
16780 if (!m_comboTarget)
16781 {
16782 return;
16783 }
16784
16785 // remove Premed-like effects
16786 // (NB: this Aura retains the CP while it's active - now that CP have reset, it shouldn't be there anymore)
16788
16789 m_comboPoints = 0;
16792 m_comboTarget = nullptr;
16793}
@ SPELL_AURA_RETAIN_COMBO_POINTS
Definition: SpellAuraDefines.h:211

References m_comboPoints, m_comboTarget, RemoveAurasByType(), RemoveComboPointHolder(), SendComboPoints(), and SPELL_AURA_RETAIN_COMBO_POINTS.

Referenced by Spell::_handle_finish_phase(), CleanupBeforeRemoveFromMap(), ClearAllReactives(), ClearComboPointHolders(), Player::DuelComplete(), Player::RemoveFromWorld(), Player::setDeathState(), and UpdateReactives().

◆ ClearDiminishings()

void Unit::ClearDiminishings ( )
inline
672{ m_Diminishing.clear(); }

References m_Diminishing.

Referenced by setDeathState().

◆ ClearInCombat()

void Unit::ClearInCombat ( )
13725{
13726 m_CombatTimer = 0;
13728
13729 // Player's state will be cleared in Player::UpdateContestedPvP
13730 if (Creature* creature = ToCreature())
13731 {
13732 if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC)
13733 SetImmuneToPC(true); // set immunity state to the one from db on evade
13734
13737 ReplaceAllDynamicFlags(creature->GetCreatureTemplate()->dynamicflags);
13738
13739 creature->SetAssistanceTimer(0);
13740
13741 // Xinef: will be recalculated at follow movement generator initialization
13742 if (!IsPet() && !IsCharmed())
13743 return;
13744 }
13745 else if (Player* player = ToPlayer())
13746 {
13747 player->UpdatePotionCooldown();
13748 if (player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
13749 for (uint8 i = 0; i < MAX_RUNES; ++i)
13750 player->SetGracePeriod(i, 0);
13751 }
13752
13753 if (Player* player = this->ToPlayer())
13754 {
13755 sScriptMgr->OnPlayerLeaveCombat(player);
13756 }
13757}
@ CLASS_CONTEXT_ABILITY
Definition: UnitDefines.h:213
@ UNIT_STATE_ATTACK_PLAYER
Definition: UnitDefines.h:163
@ UNIT_FLAG_IN_COMBAT
Definition: UnitDefines.h:248
@ UNIT_FLAG_IMMUNE_TO_PC
Definition: UnitDefines.h:237
#define MAX_RUNES
Definition: Player.h:398
@ CLASS_DEATH_KNIGHT
Definition: SharedDefines.h:146
void ReplaceAllDynamicFlags(uint32 flag) override
Definition: Unit.h:666
bool IsCharmed() const
Definition: Unit.h:1213
bool IsPet() const
Definition: Unit.h:753
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition: Unit.cpp:13528
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:826

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, ClearUnitState(), Object::HasDynamicFlag(), IsCharmed(), IsPet(), m_CombatTimer, MAX_RUNES, RemoveUnitFlag(), ReplaceAllDynamicFlags(), SetImmuneToPC(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_DYNFLAG_TAPPED, UNIT_FLAG_IMMUNE_TO_PC, UNIT_FLAG_IN_COMBAT, and UNIT_STATE_ATTACK_PLAYER.

Referenced by CombatStop(), Player::LoadFromDB(), and Update().

◆ ClearInPetCombat()

◆ ClearUnitState()

void Unit::ClearUnitState ( uint32  f)
inline
739{ m_state &= ~f; }

References m_state.

Referenced by Spell::_cast(), HomeMovementGenerator< Creature >::_setTargetLocation(), Attack(), FollowerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), AttackStop(), ClearInCombat(), boss_thorim::boss_thorimAI::DisableThorim(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), HomeMovementGenerator< Creature >::DoFinalize(), WaypointMovementGenerator< Creature >::DoFinalize(), RandomMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), RandomMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), Spell::EffectResurrectPet(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_ayamiss::EnterEvadeMode(), SmartAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), TimedFleeingMovementGenerator::Finalize(), RotateMovementGenerator::Finalize(), DistractMovementGenerator::Finalize(), AssistanceDistractMovementGenerator::Finalize(), Spell::finish(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), SmartAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MotionMaster::MoveTargetedHome(), WaypointMovementGenerator< Creature >::OnArrived(), boss_nightbane::PathEndReached(), Creature::ReleaseFocus(), RemoveCharmedBy(), MotionTransport::RemovePassenger(), boss_ayamiss::Reset(), boss_hungarfen::Reset(), Player::ResetContestedPvP(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SetClientControl(), SetControlled(), Creature::setDeathState(), Player::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), StopMoving(), StopMovingOnCurrentPos(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), and boss_the_lich_king::boss_the_lich_kingAI::UpdateAI().

◆ CombatStart()

void Unit::CombatStart ( Unit target,
bool  initialAggro = true 
)
13547{
13548 // Xinef: Dont allow to start combat with triggers
13549 if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsTrigger())
13550 return;
13551
13552 if (initialAggro)
13553 {
13554 // Make player victim stand up automatically
13555 if (victim->getStandState() && victim->IsPlayer())
13556 {
13557 victim->SetStandState(UNIT_STAND_STATE_STAND);
13558 }
13559
13560 if (!victim->IsInCombat() && victim->GetTypeId() != TYPEID_PLAYER && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled)
13561 {
13562 if (victim->IsPet())
13563 victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart()
13564 else
13565 {
13566 victim->ToCreature()->AI()->AttackStart(this);
13567 // if the target is an NPC with a pet or minion, pet should react.
13568 if (Unit* victimControlledUnit = victim->GetFirstControlled())
13569 {
13570 victimControlledUnit->SetInCombatWith(this);
13571 SetInCombatWith(victimControlledUnit);
13572 victimControlledUnit->AddThreat(this, 0.0f);
13573 }
13574 }
13575
13576 // if unit has an owner, put owner in combat.
13577 if (Unit* victimOwner = victim->GetOwner())
13578 {
13579 if (!(victimOwner->IsInCombatWith(this)))
13580 {
13581 /* warding off to not take over aggro for no reason
13582 Using only AddThreat causes delay in attack */
13583 if (!victimOwner->IsInCombat() && victimOwner->IsAIEnabled)
13584 {
13585 victimOwner->ToCreature()->AI()->AttackStart(this);
13586 }
13587 victimOwner->SetInCombatWith(this);
13588 SetInCombatWith(victimOwner);
13589 victimOwner->AddThreat(this, 0.0f);
13590 }
13591 }
13592 }
13593
13594 bool alreadyInCombat = IsInCombat();
13595
13596 SetInCombatWith(victim);
13597 victim->SetInCombatWith(this);
13598
13599 // Xinef: If pet started combat - put owner in combat
13600 if (!alreadyInCombat && IsInCombat())
13601 {
13602 if (Unit* owner = GetOwner())
13603 {
13604 owner->SetInCombatWith(victim);
13605 victim->SetInCombatWith(owner);
13606 }
13607 }
13608 }
13609
13610 Unit* who = victim->GetCharmerOrOwnerOrSelf();
13611 if (who->IsPlayer())
13612 SetContestedPvP(who->ToPlayer());
13613
13615 if (player && who->IsPvP() && (who->GetTypeId() != TYPEID_PLAYER || !player->duel || player->duel->Opponent != who))
13616 {
13617 player->UpdatePvP(true);
13619 }
13620}
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:32
@ REACT_PASSIVE
Definition: Unit.h:548
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition: SpellDefines.h:67
void UpdatePvP(bool state, bool _override=false)
Definition: PlayerUpdates.cpp:1480
Unit * GetCharmerOrOwnerOrSelf() const
Definition: Unit.h:1190
void SetContestedPvP(Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
Definition: Unit.cpp:17162
Unit * GetFirstControlled() const
Definition: Unit.cpp:10996
bool IsInCombat() const
Definition: Unit.h:1031

References Creature::AI(), CreatureAI::AttackedBy(), UnitAI::AttackStart(), AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetFirstControlled(), GetOwner(), getStandState(), Object::GetTypeId(), Creature::HasReactState(), IsAIEnabled, IsInCombat(), IsPet(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), REACT_PASSIVE, RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), SetStandState(), Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_STAND_STATE_STAND, and Player::UpdatePvP().

Referenced by AttackerStateUpdate(), Spell::CheckCast(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectTaunt(), and AssistDelayEvent::Execute().

◆ CombatStartOnCast()

void Unit::CombatStartOnCast ( Unit target,
bool  initialAggro = true,
uint32  duration = 0 
)
13623{
13624 // Xinef: Dont allow to start combat with triggers
13625 if (target->GetTypeId() == TYPEID_UNIT && target->ToCreature()->IsTrigger())
13626 return;
13627
13628 if (initialAggro)
13629 {
13630 SetInCombatWith(target, duration);
13631
13632 // Xinef: If pet started combat - put owner in combat
13633 if (Unit* owner = GetOwner())
13634 owner->SetInCombatWith(target, duration);
13635 }
13636
13637 Unit* who = target->GetCharmerOrOwnerOrSelf();
13638 if (who->IsPlayer())
13639 SetContestedPvP(who->ToPlayer());
13640
13642 if (player && who->IsPvP() && (who->GetTypeId() != TYPEID_PLAYER || !player->duel || player->duel->Opponent != who))
13643 {
13644 player->UpdatePvP(true);
13646 }
13647}
bool IsTrigger() const
Definition: Creature.h:78

References AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetOwner(), Object::GetTypeId(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, and Player::UpdatePvP().

Referenced by Spell::_cast().

◆ CombatStop()

void Unit::CombatStop ( bool  includingCast = false)
10368{
10369 if (includingCast && IsNonMeleeSpellCast(false))
10371
10372 AttackStop();
10374 if (IsPlayer())
10375 ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel
10376 ClearInCombat();
10377
10378 // xinef: just in case
10381}
void SendAttackSwingCancelAttack()
Definition: PlayerMisc.cpp:140
bool IsPetInCombat() const
Definition: Unit.h:1034
void ClearInPetCombat()
Definition: Unit.cpp:13759
void RemoveAllAttackers()
Definition: Unit.cpp:10410
void ClearInCombat()
Definition: Unit.cpp:13724
bool AttackStop()
Definition: Unit.cpp:10334

References AttackStop(), ClearInCombat(), ClearInPetCombat(), Object::GetTypeId(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), IsPetInCombat(), Object::IsPlayer(), RemoveAllAttackers(), Player::SendAttackSwingCancelAttack(), Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by CreatureAI::_EnterEvadeMode(), PetAI::_stopAttack(), Player::ActivateTaxiPathTo(), CleanupBeforeRemoveFromMap(), CombatStopWithPets(), boss_felblood_kaelthas::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_akama_illidan::npc_akama_illidanAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSanctuary(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), TotemAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleCombatStopCommand(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), npc_commandscript::HandleNpcDeleteCommand(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), SmartScript::ProcessAction(), Player::RemovePet(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), setDeathState(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), Player::TeleportTo(), Totem::UnSummon(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ CombatStopWithPets()

void Unit::CombatStopWithPets ( bool  includingCast = false)
10384{
10385 CombatStop(includingCast);
10386
10387 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10388 (*itr)->CombatStop(includingCast);
10389}

References CombatStop(), and m_Controlled.

Referenced by DealDamage(), WorldSession::HandleDuelCancelledOpcode(), Player::SetGameMaster(), Player::SetGMVisible(), and Player::UpdateArea().

◆ CountPctFromCurHealth()

uint32 Unit::CountPctFromCurHealth ( int32  pct) const
inline
791{ return CalculatePct(GetHealth(), pct); }
uint32 GetHealth() const
Definition: Unit.h:781

References CalculatePct(), and GetHealth().

Referenced by spell_gen_leeching_swarm::spell_gen_leeching_swarm_AuraScript::HandleEffectPeriodic().

◆ CountPctFromMaxHealth()

uint32 Unit::CountPctFromMaxHealth ( int32  pct) const
inline
790{ return CalculatePct(GetMaxHealth(), pct); }
uint32 GetMaxHealth() const
Definition: Unit.h:782

References CalculatePct(), and GetMaxHealth().

Referenced by spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_dk_anti_magic_shell_self::CalculateAmount(), spell_dk_vampiric_blood::CalculateAmount(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::EffectHeal(), Spell::EffectHealPct(), Spell::EffectResurrect(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonType(), spell_alar_ember_blast::HandleCast(), spell_dk_death_strike::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_warr_last_stand::HandleDummy(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), boss_harbinger_skyriss::JustSummoned(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Pet::LoadPetFromDB(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_zuljin::boss_zuljinAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), and npc_injured_patient::npc_injured_patientAI::UpdateAI().

◆ CreateTamedPetFrom() [1/2]

Pet * Unit::CreateTamedPetFrom ( Creature creatureTarget,
uint32  spell_id = 0 
)
17255{
17256 if (GetTypeId() != TYPEID_PLAYER)
17257 return nullptr;
17258
17259 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17260
17261 if (!pet->CreateBaseAtCreature(creatureTarget))
17262 {
17263 delete pet;
17264 return nullptr;
17265 }
17266
17267 uint8 level = creatureTarget->GetLevel() + 5 < GetLevel() ? (GetLevel() - 5) : creatureTarget->GetLevel();
17268
17269 if (!InitTamedPet(pet, level, spell_id))
17270 {
17271 delete pet;
17272 return nullptr;
17273 }
17274
17275 return pet;
17276}
@ HUNTER_PET
Definition: PetDefines.h:32
bool CreateBaseAtCreature(Creature *creature)
Definition: Pet.cpp:944
bool InitTamedPet(Pet *pet, uint8 level, uint32 spell_id)
Definition: Unit.cpp:17298

References Pet::CreateBaseAtCreature(), GetLevel(), Object::GetTypeId(), HUNTER_PET, InitTamedPet(), Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by Player::CreatePet(), Spell::EffectCreateTamedPet(), and Spell::EffectTameCreature().

◆ CreateTamedPetFrom() [2/2]

Pet * Unit::CreateTamedPetFrom ( uint32  creatureEntry,
uint32  spell_id = 0 
)
17279{
17280 if (GetTypeId() != TYPEID_PLAYER)
17281 return nullptr;
17282
17283 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry);
17284 if (!creatureInfo)
17285 return nullptr;
17286
17287 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17288
17289 if (!pet->CreateBaseAtCreatureInfo(creatureInfo, this) || !InitTamedPet(pet, GetLevel(), spell_id))
17290 {
17291 delete pet;
17292 return nullptr;
17293 }
17294
17295 return pet;
17296}
#define sObjectMgr
Definition: ObjectMgr.h:1623
Definition: CreatureData.h:189
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
Definition: Pet.cpp:979

References Pet::CreateBaseAtCreatureInfo(), GetLevel(), Object::GetTypeId(), HUNTER_PET, InitTamedPet(), sObjectMgr, Object::ToPlayer(), and TYPEID_PLAYER.

◆ CreateVehicleKit()

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)
18619{
18620 VehicleEntry const* vehInfo = sVehicleStore.LookupEntry(id);
18621 if (!vehInfo)
18622 return false;
18623
18624 m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
18627 return true;
18628}
@ UNIT_MASK_VEHICLE
Definition: UnitDefines.h:140
@ UPDATEFLAG_VEHICLE
Definition: UpdateData.h:46
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, sVehicleStore, UNIT_MASK_VEHICLE, and UPDATEFLAG_VEHICLE.

Referenced by Creature::CreateFromProto(), AuraEffect::HandleAuraSetVehicle(), Mount(), and npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit().

◆ DealDamage()

uint32 Unit::DealDamage ( Unit attacker,
Unit victim,
uint32  damage,
CleanDamage const *  cleanDamage = nullptr,
DamageEffectType  damagetype = DIRECT_DAMAGE,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  spellProto = nullptr,
bool  durabilityLoss = true,
bool  allowGM = false,
Spell const *  spell = nullptr 
)
static
798{
799 // Xinef: initialize damage done for rage calculations
800 // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0
801 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0);
802
803 //if (attacker)
804 {
805 if (victim->IsAIEnabled)
806 victim->GetAI()->DamageTaken(attacker, damage, damagetype, damageSchoolMask);
807
808 if (attacker && attacker->IsAIEnabled)
809 attacker->GetAI()->DamageDealt(victim, damage, damagetype);
810 }
811
812 // Hook for OnDamage Event
813 sScriptMgr->OnDamage(attacker, victim, damage);
814
815 if (victim->IsPlayer() && attacker != victim)
816 {
817 // Signal to pets that their owner was attacked
818 Pet* pet = victim->ToPlayer()->GetPet();
819
820 if (pet && pet->IsAlive())
821 pet->AI()->OwnerAttackedBy(attacker);
822 }
823
824 //Dont deal damage to unit if .cheat god is enable.
825 if (victim->IsPlayer())
826 {
827 if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD))
828 {
829 return 0;
830 }
831 }
832
833 // Signal the pet it was attacked so the AI can respond if needed
834 if (victim->GetTypeId() == TYPEID_UNIT && attacker != victim && victim->IsPet() && victim->IsAlive())
835 victim->ToPet()->AI()->AttackedBy(attacker);
836
837 if (damagetype != NODAMAGE)
838 {
839 // interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras)
840 if (spellProto)
841 {
842 if (!spellProto->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
844 }
845 else
847
848 // interrupt spells with SPELL_INTERRUPT_FLAG_ABORT_ON_DMG on absorbed damage (no dots)
849 if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage)
850 {
851 if (victim != attacker && victim->IsPlayer())
852 {
853 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
854 {
855 if (spell->getState() == SPELL_STATE_PREPARING)
856 {
857 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
858 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
859 {
860 victim->InterruptNonMeleeSpells(false);
861 }
862 }
863 }
864 }
865 }
866
867 // We're going to call functions which can modify content of the list during iteration over it's elements
868 // Let's copy the list so we can prevent iterator invalidation
870 // copy damage to casters of this aura
871 for (AuraEffectList::iterator i = vCopyDamageCopy.begin(); i != vCopyDamageCopy.end(); ++i)
872 {
873 // Check if aura was removed during iteration - we don't need to work on such auras
874 if (!((*i)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
875 continue;
876 // check damage school mask
877 if (((*i)->GetMiscValue() & damageSchoolMask) == 0)
878 continue;
879
880 Unit* shareDamageTarget = (*i)->GetCaster();
881 if (!shareDamageTarget)
882 continue;
883 SpellInfo const* spell = (*i)->GetSpellInfo();
884
885 uint32 shareDamage = CalculatePct(damage, (*i)->GetAmount());
886
887 uint32 shareAbsorb = 0;
888 uint32 shareResist = 0;
889
890 if (shareDamageTarget->IsImmunedToDamageOrSchool(damageSchoolMask))
891 {
892 shareAbsorb = shareDamage;
893 shareDamage = 0;
894 }
895 else
896 {
897 DamageInfo sharedDamageInfo(attacker, shareDamageTarget, shareDamage, spellProto, damageSchoolMask, damagetype);
898 Unit::CalcAbsorbResist(sharedDamageInfo, true);
899 shareAbsorb = sharedDamageInfo.GetAbsorb();
900 shareResist = sharedDamageInfo.GetResist();
901 shareDamage = sharedDamageInfo.GetDamage();
902 Unit::DealDamageMods(shareDamageTarget, shareDamage, &shareAbsorb);
903 }
904
905 if (attacker && shareDamageTarget->IsPlayer())
906 {
907 attacker->SendSpellNonMeleeDamageLog(shareDamageTarget, spell, shareDamage, damageSchoolMask, shareAbsorb, shareResist, damagetype == DIRECT_DAMAGE, 0, false, true);
908 }
909
910 Unit::DealDamage(attacker, shareDamageTarget, shareDamage, cleanDamage, NODAMAGE, damageSchoolMask, spellProto, false, false, damageSpell);
911 }
912 }
913
914 // Rage from Damage made (only from direct weapon damage)
915 if (attacker && cleanDamage && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->HasActivePowerType(POWER_RAGE))
916 {
917 uint32 weaponSpeedHitFactor;
918
919 switch (cleanDamage->attackType)
920 {
921 case BASE_ATTACK:
922 case OFF_ATTACK:
923 {
924 weaponSpeedHitFactor = uint32(attacker->GetAttackTime(cleanDamage->attackType) / 1000.0f * (cleanDamage->attackType == BASE_ATTACK ? 3.5f : 1.75f));
925 if (cleanDamage->hitOutCome == MELEE_HIT_CRIT)
926 weaponSpeedHitFactor *= 2;
927
928 attacker->RewardRage(rage_damage, weaponSpeedHitFactor, true);
929 break;
930 }
931 case RANGED_ATTACK:
932 break;
933 default:
934 break;
935 }
936 }
937
938 if (!damage)
939 {
940 // Rage from absorbed damage
941 if (cleanDamage && cleanDamage->absorbed_damage)
942 {
943 if (victim->HasActivePowerType(POWER_RAGE))
944 victim->RewardRage(cleanDamage->absorbed_damage, 0, false);
945
946 if (attacker && attacker->HasActivePowerType(POWER_RAGE))
947 attacker->RewardRage(cleanDamage->absorbed_damage, 0, true);
948 }
949
950 return 0;
951 }
952
953 LOG_DEBUG("entities.unit", "DealDamageStart");
954
955 uint32 health = victim->GetHealth();
956 LOG_DEBUG("entities.unit", "deal dmg:{} to health:{} ", damage, health);
957
958 // duel ends when player has 1 or less hp
959 bool duel_hasEnded = false;
960 bool duel_wasMounted = false;
961 if (victim->IsPlayer() && victim->ToPlayer()->duel && damage >= (health - 1))
962 {
963 // xinef: situation not possible earlier, just return silently.
964 if (!attacker)
965 return 0;
966
967 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
968 if (victim->ToPlayer()->duel->Opponent == attacker || victim->ToPlayer()->duel->Opponent->GetGUID() == attacker->GetOwnerGUID())
969 damage = health - 1;
970
971 duel_hasEnded = true;
972 }
973 else if (victim->IsVehicle() && damage >= (health - 1) && victim->GetCharmer() && victim->GetCharmer()->IsPlayer())
974 {
975 Player* victimRider = victim->GetCharmer()->ToPlayer();
976
977 if (victimRider && victimRider->duel && victimRider->duel->IsMounted)
978 {
979 // xinef: situation not possible earlier, just return silently.
980 if (!attacker)
981 return 0;
982
983 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
984 if (victimRider->duel->Opponent == attacker || victimRider->duel->Opponent->GetGUID() == attacker->GetCharmerGUID())
985 damage = health - 1;
986
987 duel_wasMounted = true;
988 duel_hasEnded = true;
989 }
990 }
991
992 if (attacker && attacker != victim)
993 if (Player* killer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself())
994 {
995 // pussywizard: don't allow GMs to deal damage in normal way (this leaves no evidence in logs!), they have commands to do so
996 //if (!allowGM && killer->GetSession()->GetSecurity() && killer->GetSession()->GetSecurity() <= SEC_ADMINISTRATOR)
997 // return 0;
998
999 if (Battleground* bg = killer->GetBattleground())
1000 {
1001 bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
1002 killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, victim); // pussywizard: InBattleground() optimization
1003 }
1004 //killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); // pussywizard: optimization
1005 }
1006
1007 if (victim->IsPlayer())
1008 ;//victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); // pussywizard: optimization
1009 else if (!victim->IsControlledByPlayer() || victim->IsVehicle())
1010 {
1011 if (!victim->ToCreature()->hasLootRecipient())
1012 victim->ToCreature()->SetLootRecipient(attacker);
1013
1014 if (!attacker || attacker->IsControlledByPlayer() || attacker->IsCreatedByPlayer())
1015 {
1016 uint32 unDamage = health < damage ? health : damage;
1017 bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->m_movedByPlayer != nullptr);
1018 victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);
1019 }
1020 }
1021
1022 if (health <= damage)
1023 {
1024 LOG_DEBUG("entities.unit", "DealDamage: victim just died");
1025
1026 //if (attacker && victim->IsPlayer() && victim != attacker)
1027 //victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); // pussywizard: optimization
1028 Unit::Kill(attacker, victim, durabilityLoss, cleanDamage ? cleanDamage->attackType : BASE_ATTACK, spellProto, damageSpell);
1029 }
1030 else
1031 {
1032 LOG_DEBUG("entities.unit", "DealDamageAlive");
1033
1034 //if (victim->IsPlayer())
1035 // victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage); // pussywizard: optimization
1036
1037 victim->ModifyHealth(- (int32)damage);
1038
1039 if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE)
1040 victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
1041
1042 if (victim->GetTypeId() != TYPEID_PLAYER)
1043 {
1044 // Part of Evade mechanics. DoT's and Thorns / Retribution Aura do not contribute to this
1045 if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD)))
1047
1048 if (attacker)
1049 {
1050 if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker))
1051 {
1052 victim->CombatStart(attacker, !(spellProto->AttributesEx3 & SPELL_ATTR3_SUPRESS_TARGET_PROCS));
1053 }
1054
1055 victim->AddThreat(attacker, float(damage), damageSchoolMask, spellProto);
1056 }
1057 }
1058 else // victim is a player
1059 {
1060 // random durability for items (HIT TAKEN)
1062 {
1065 }
1066 }
1067
1068 // Rage from damage received
1069 if (attacker != victim && victim->HasActivePowerType(POWER_RAGE))
1070 {
1071 uint32 rageDamage = damage + (cleanDamage ? cleanDamage->absorbed_damage : 0);
1072 victim->RewardRage(rageDamage, 0, false);
1073 }
1074
1075 if (attacker && attacker->IsPlayer())
1076 {
1077 // random durability for items (HIT DONE)
1079 {
1081 attacker->ToPlayer()->DurabilityPointLossForEquipSlot(slot);
1082 }
1083 }
1084
1085 if (damagetype != NODAMAGE && damage && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC) || spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK))))
1086 {
1087 if (victim != attacker && victim->IsPlayer()) // does not support creature push_back
1088 {
1089 if (damagetype != DOT && !(damageSpell && damageSpell->m_targets.HasDstChannel()))
1090 {
1091 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
1092 {
1093 if (spell->getState() == SPELL_STATE_PREPARING)
1094 {
1095 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
1096 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
1097 {
1098 victim->InterruptNonMeleeSpells(false);
1099 }
1100 else if (interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
1101 {
1102 spell->Delayed();
1103 }
1104 }
1105 }
1106
1107 if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])
1108 if (spell->getState() == SPELL_STATE_CASTING)
1109 {
1110 if ((spell->m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) != 0)
1111 {
1112 spell->DelayedChannel();
1113 }
1114 }
1115 }
1116 }
1117 }
1118
1119 // last damage from duel opponent
1120 if (duel_hasEnded)
1121 {
1122 Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer();
1123
1124 ASSERT_NODEBUGINFO(he && he->duel);
1125
1126 if (duel_wasMounted) // In this case victim==mount
1127 victim->SetHealth(1);
1128 else
1129 he->SetHealth(1);
1130
1131 he->duel->Opponent->CombatStopWithPets(true);
1132 he->CombatStopWithPets(true);
1133
1134 he->CastSpell(he, 7267, true); // beg
1136 }
1137 }
1138
1139 LOG_DEBUG("entities.unit", "DealDamageEnd returned {} damage", damage);
1140
1141 return damage;
1142}
bool roll_chance_f(float chance)
Definition: Random.h:53
#define ASSERT_NODEBUGINFO
Definition: Errors.h:69
@ NODAMAGE
Definition: Unit.h:252
@ CURRENT_CHANNELED_SPELL
Definition: Unit.h:539
@ CURRENT_GENERIC_SPELL
Definition: Unit.h:538
@ CHEAT_GOD
Definition: Player.h:998
EquipmentSlots
Definition: Player.h:673
@ EQUIPMENT_SLOT_END
Definition: Player.h:694
#define MAX_AGGRO_RESET_TIME
Definition: CreatureData.h:29
@ SPELL_AURA_DAMAGE_SHIELD
Definition: SpellAuraDefines.h:78
@ SPELL_AURA_SHARE_DAMAGE_PCT
Definition: SpellAuraDefines.h:363
@ CHANNEL_FLAG_DELAY
Definition: SpellDefines.h:39
@ AURA_INTERRUPT_FLAG_TAKE_DAMAGE
Definition: SpellDefines.h:45
@ AURA_INTERRUPT_FLAG_DIRECT_DAMAGE
Definition: SpellDefines.h:68
@ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG
Definition: SpellDefines.h:31
@ SPELL_INTERRUPT_FLAG_PUSH_BACK
Definition: SpellDefines.h:28
@ SPELL_STATE_PREPARING
Definition: Spell.h:224
@ SPELL_STATE_CASTING
Definition: Spell.h:225
@ RATE_DURABILITY_LOSS_DAMAGE
Definition: IWorld.h:516
@ SCORE_DAMAGE_DONE
Definition: BattlegroundScore.h:33
@ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE
Definition: DBCEnums.h:130
@ POWER_RAGE
Definition: SharedDefines.h:270
@ SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK
Definition: SharedDefines.h:647
@ SPELL_ATTR3_TREAT_AS_PERIODIC
Definition: SharedDefines.h:518
@ SPELL_ATTR3_SUPRESS_TARGET_PROCS
Definition: SharedDefines.h:510
@ DUEL_WON
Definition: SharedDefines.h:3613
@ SPELL_ATTR4_REACTIVE_DAMAGE_PROC
Definition: SharedDefines.h:544
virtual void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Definition: UnitAI.h:367
virtual void DamageDealt(Unit *, uint32 &, DamageEffectType)
Definition: UnitAI.h:362
virtual void OwnerAttackedBy(Unit *)
Definition: CreatureAI.h:172
virtual void AttackedBy(Unit *)
Definition: CreatureAI.h:149
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition: Creature.cpp:1313
void SetLastDamagedTime(time_t val)
Definition: Creature.cpp:3659
bool hasLootRecipient() const
Definition: Creature.h:226
void LowerPlayerDamageReq(uint32 unDamage, bool damagedByPlayer=true)
Definition: Creature.cpp:3765
CreatureAI * AI() const
Definition: Creature.h:137
bool IsPlayer() const
Definition: ObjectGuid.h:168
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition: PlayerUpdates.cpp:2127
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition: Player.cpp:4760
Pet * GetPet() const
Definition: Player.cpp:8862
bool GetCommandStatus(uint32 command) const
Definition: Player.h:1177
int32 ModifyHealth(int32 val)
Definition: Unit.cpp:14006
Pet * ToPet()
Definition: Unit.h:1740
bool IsCreatedByPlayer() const
Definition: Unit.h:1171
Unit * GetCharmer() const
Definition: Unit.cpp:10534
static void Kill(Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
Definition: Unit.cpp:17605
void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
Definition: Unit.cpp:20041
void SetHealth(uint32 val)
Definition: Unit.cpp:15391
ObjectGuid GetCharmerGUID() const
Definition: Unit.h:1162
virtual bool HasActivePowerType(Powers power)
Definition: Unit.h:802
void CombatStopWithPets(bool includingCast=false)
Definition: Unit.cpp:10383
uint32 ChannelInterruptFlags
Definition: SpellInfo.h:354
uint32 InterruptFlags
Definition: SpellInfo.h:352

References CleanDamage::absorbed_damage, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, AddThreat(), Creature::AI(), ASSERT_NODEBUGINFO, CreatureAI::AttackedBy(), CleanDamage::attackType, SpellInfo::AttributesEx3, AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, AURA_INTERRUPT_FLAG_TAKE_DAMAGE, BASE_ATTACK, CalcAbsorbResist(), CalculatePct(), CanHaveThreatList(), CastSpell(), CHANNEL_FLAG_DELAY, CHEAT_GOD, CombatStart(), CombatStopWithPets(), CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, UnitAI::DamageDealt(), UnitAI::DamageTaken(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, DOT, Player::duel, DUEL_WON, Player::DuelComplete(), Player::DurabilityPointLossForEquipSlot(), EQUIPMENT_SLOT_END, DamageInfo::GetAbsorb(), GetAI(), GetAttackTime(), GetAuraEffectsByType(), GetCharmer(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), Player::GetCommandStatus(), DamageInfo::GetDamage(), GameTime::GetGameTime(), Object::GetGUID(), GetHealth(), GetOwnerGUID(), Player::GetPet(), DamageInfo::GetResist(), Object::GetTypeId(), HasActivePowerType(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellCastTargets::HasDstChannel(), Creature::hasLootRecipient(), HasUnitState(), CleanDamage::hitOutCome, SpellInfo::Id, InterruptNonMeleeSpells(), IsAIEnabled, IsAlive(), IsControlledByPlayer(), IsCreatedByPlayer(), IsImmunedToDamageOrSchool(), IsInCombatWith(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), IsVehicle(), Kill(), LOG_DEBUG, Creature::LowerPlayerDamageReq(), m_currentSpells, m_movedByPlayer, Spell::m_targets, MAX_AGGRO_RESET_TIME, MELEE_HIT_CRIT, ModifyHealth(), NODAMAGE, OFF_ATTACK, CreatureAI::OwnerAttackedBy(), POWER_RAGE, RANGED_ATTACK, RATE_DURABILITY_LOSS_DAMAGE, RemoveAurasWithInterruptFlags(), RewardRage(), roll_chance_f(), SCORE_DAMAGE_DONE, SendSpellNonMeleeDamageLog(), SetHealth(), Creature::SetLastDamagedTime(), Creature::SetLootRecipient(), SPELL_ATTR3_SUPRESS_TARGET_PROCS, SPELL_ATTR3_TREAT_AS_PERIODIC, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK, SPELL_AURA_DAMAGE_SHIELD, SPELL_AURA_SHARE_DAMAGE_PCT, SPELL_DIRECT_DAMAGE, SPELL_INTERRUPT_FLAG_ABORT_ON_DMG, SPELL_INTERRUPT_FLAG_PUSH_BACK, SPELL_STATE_CASTING, SPELL_STATE_PREPARING, sScriptMgr, sWorld, Object::ToCreature(), ToPet(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_STATE_EVADE, Player::UpdateAchievementCriteria(), and urand().

Referenced by CalcAbsorbResist(), DealDamage(), DealMeleeDamage(), DealSpellDamage(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectInstaKill(), Player::EnvironmentalDamage(), spell_mt_phoenix_burn::HandleAfterCast(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), spell_svala_ritual_strike::HandleDummyEffect(), spell_lady_vashj_magic_barrier::HandleEffectRemove(), spell_algalon_collapse_aura::HandlePeriodic(), spell_kaelthas_burn::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_gluth_decimate::HandleScriptEffect(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustDied(), spell_valkyr_touch::spell_valkyr_touchAuraScript::PrepareAuraScript(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ DealDamageMods()

◆ DealHeal()

int32 Unit::DealHeal ( Unit healer,
Unit victim,
uint32  addhealth 
)
static
10873{
10874 int32 gain = 0;
10875
10876 if (healer)
10877 {
10878 if (victim->IsAIEnabled)
10879 victim->GetAI()->HealReceived(healer, addhealth);
10880
10881 if (healer->IsAIEnabled)
10882 healer->GetAI()->HealDone(victim, addhealth);
10883 }
10884
10885 if (addhealth)
10886 gain = victim->ModifyHealth(int32(addhealth));
10887
10888 // Hook for OnHeal Event
10889 sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
10890
10891 Unit* unit = healer;
10892
10893 if (healer && healer->GetTypeId() == TYPEID_UNIT && healer->ToCreature()->IsTotem())
10894 unit = healer->GetOwner();
10895
10896 if (!unit)
10897 return gain;
10898
10899 if (Player* player = unit->ToPlayer())
10900 {
10901 if (Battleground* bg = player->GetBattleground())
10902 bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
10903
10904 // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
10905 if (gain && player->InBattleground()) // pussywizard: InBattleground() optimization
10906 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim);
10907
10908 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization
10909 }
10910
10911 /*if (Player* player = victim->ToPlayer())
10912 {
10913 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization
10914 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); // pussywizard: optimization
10915 }*/
10916
10917 return gain;
10918}
@ SCORE_HEALING_DONE
Definition: BattlegroundScore.h:34
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition: DBCEnums.h:169
virtual void HealReceived(Unit *, uint32 &)
Definition: UnitAI.h:370
virtual void HealDone(Unit *, uint32 &)
Definition: UnitAI.h:376

References ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, GetAI(), GetOwner(), Object::GetTypeId(), UnitAI::HealDone(), UnitAI::HealReceived(), IsAIEnabled, IsTotem(), ModifyHealth(), SCORE_HEALING_DONE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), and TYPEID_UNIT.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), HealBySpell(), and npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI().

◆ DealMeleeDamage()

void Unit::DealMeleeDamage ( CalcDamageInfo damageInfo,
bool  durabilityLoss 
)
Todo:
: Move this to a packet handler
1814{
1815 Unit* victim = damageInfo->target;
1816
1817 auto canTakeMeleeDamage = [&]()
1818 {
1819 return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (victim->GetTypeId() != TYPEID_UNIT || !victim->ToCreature()->IsEvadingAttacks());
1820 };
1821
1822 if (!canTakeMeleeDamage())
1823 {
1824 return;
1825 }
1826
1827 // Hmmmm dont like this emotes client must by self do all animations
1828 if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
1830 if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
1832
1833 if (damageInfo->TargetState == VICTIMSTATE_PARRY)
1834 {
1835 // Get attack timers
1836 float offtime = float(victim->getAttackTimer(OFF_ATTACK));
1837 float basetime = float(victim->getAttackTimer(BASE_ATTACK));
1838 // Reduce attack time
1839 if (victim->haveOffhandWeapon() && offtime < basetime)
1840 {
1841 float percent20 = victim->GetAttackTime(OFF_ATTACK) * 0.20f;
1842 float percent60 = 3.0f * percent20;
1843 if (offtime > percent20 && offtime <= percent60)
1844 victim->setAttackTimer(OFF_ATTACK, uint32(percent20));
1845 else if (offtime > percent60)
1846 {
1847 offtime -= 2.0f * percent20;
1848 victim->setAttackTimer(OFF_ATTACK, uint32(offtime));
1849 }
1850 }
1851 else
1852 {
1853 float percent20 = victim->GetAttackTime(BASE_ATTACK) * 0.20f;
1854 float percent60 = 3.0f * percent20;
1855 if (basetime > percent20 && basetime <= percent60)
1856 victim->setAttackTimer(BASE_ATTACK, uint32(percent20));
1857 else if (basetime > percent60)
1858 {
1859 basetime -= 2.0f * percent20;
1860 victim->setAttackTimer(BASE_ATTACK, uint32(basetime));
1861 }
1862 }
1863 }
1864
1865 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1866 {
1867 if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist))
1868 {
1869 continue;
1870 }
1871
1872 // Call default DealDamage
1873 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome);
1874 Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss);
1875 }
1876
1877 // If this is a creature and it attacks from behind it has a probability to daze it's victim
1878 if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) &&
1879 GetTypeId() != TYPEID_PLAYER && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)
1880 && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))
1881 {
1882 // -probability is between 0% and 40%
1883 // 20% base chance
1884 float Probability = 20.0f;
1885
1886 // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
1887 if (victim->GetLevel() < 30)
1888 Probability = 0.65f * victim->GetLevel() + 0.5f;
1889
1890 uint32 VictimDefense = victim->GetDefenseSkillValue();
1891 uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
1892
1893 // xinef: fix daze mechanics
1894 Probability -= ((float)VictimDefense - AttackerMeleeSkill) * 0.1428f;
1895
1896 if (Probability > 40.0f)
1897 Probability = 40.0f;
1898
1899 // Daze application
1900 if (sWorld->getBoolConfig(CONFIG_ENABLE_DAZE))
1901 if (roll_chance_f(std::max(0.0f, Probability)))
1902 CastSpell(victim, 1604, true);
1903 }
1904
1905 if (IsPlayer())
1906 ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx);
1907
1908 // Do effect if any damage done to target
1909 if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)
1910 {
1911 // We're going to call functions which can modify content of the list during iteration over it's elements
1912 // Let's copy the list so we can prevent iterator invalidation
1914 for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
1915 {
1916 SpellInfo const* i_spellProto = (*dmgShieldItr)->GetSpellInfo();
1917 // Damage shield can be resisted...
1918 if (SpellMissInfo missInfo = victim->SpellHitResult(this, i_spellProto, false))
1919 {
1920 victim->SendSpellMiss(this, i_spellProto->Id, missInfo);
1921 continue;
1922 }
1923
1924 // ...or immuned
1925 if (IsImmunedToDamageOrSchool(i_spellProto))
1926 {
1927 victim->SendSpellDamageImmune(this, i_spellProto->Id);
1928 continue;
1929 }
1930
1931 uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation
1932
1933 if (Unit* caster = (*dmgShieldItr)->GetCaster())
1934 {
1935 damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex());
1936 damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
1937 }
1938
1939 uint32 absorb = 0;
1940
1941 DamageInfo dmgInfo(victim, this, damage, i_spellProto, i_spellProto->GetSchoolMask(), SPELL_DIRECT_DAMAGE);
1942 Unit::CalcAbsorbResist(dmgInfo);
1943 absorb = dmgInfo.GetAbsorb();
1944 damage = dmgInfo.GetDamage();
1945
1946 Unit::DealDamageMods(this, damage, &absorb);
1947
1949 WorldPacket data(SMSG_SPELLDAMAGESHIELD, (8 + 8 + 4 + 4 + 4 + 4));
1950 data << victim->GetGUID();
1951 data << GetGUID();
1952 data << uint32(i_spellProto->Id);
1953 data << uint32(damage); // Damage
1954 int32 overkill = int32(damage) - int32(GetHealth());
1955 data << uint32(overkill > 0 ? overkill : 0); // Overkill
1956 data << uint32(i_spellProto->GetSchoolMask());
1957 victim->SendMessageToSet(&data, true);
1958
1959 Unit::DealDamage(victim, this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
1960 }
1961 }
1962}
@ CONFIG_ENABLE_DAZE
Definition: IWorld.h:190
@ EMOTE_ONESHOT_WOUND_CRITICAL
Definition: SharedDefines.h:1924
@ EMOTE_ONESHOT_PARRY_SHIELD
Definition: SharedDefines.h:1930
SpellMissInfo
Definition: SharedDefines.h:1518
@ SMSG_SPELLDAMAGESHIELD
Definition: Opcodes.h:621
bool isWorldBoss() const
Definition: Creature.h:117
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition: Position.cpp:140
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition: Player.cpp:7155
uint32 GetUnitMeleeSkill(Unit const *target=nullptr) const
Definition: Unit.h:980
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
Definition: Unit.cpp:6389
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition: Unit.cpp:3585
void SendSpellDamageImmune(Unit *target, uint32 spellId)
Definition: Unit.cpp:6413
SpellMissInfo SpellHitResult(Unit *victim, SpellInfo const *spell, bool canReflect=false)
Definition: Unit.cpp:3430
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
Definition: Unit.cpp:11712
void HandleEmoteCommand(uint32 emoteId)
Definition: Unit.cpp:1964
SpellSchoolMask GetSchoolMask() const
Definition: SpellInfo.cpp:1986

References CalcDamageInfo::absorb, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), Player::CastItemCombatSpell(), CastSpell(), CalcDamageInfo::cleanDamage, CONFIG_ENABLE_DAZE, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DealDamage(), DealDamageMods(), DIRECT_DAMAGE, EMOTE_ONESHOT_PARRY_SHIELD, EMOTE_ONESHOT_WOUND_CRITICAL, DamageInfo::GetAbsorb(), GetAttackTime(), getAttackTimer(), GetAuraEffectsByType(), DamageInfo::GetDamage(), GetDefenseSkillValue(), Object::GetGUID(), GetHealth(), GetLevel(), SpellInfo::GetSchoolMask(), Object::GetTypeId(), GetUnitMeleeSkill(), HandleEmoteCommand(), Position::HasInArc(), HasUnitState(), haveOffhandWeapon(), CalcDamageInfo::HitInfo, HITINFO_CRITICALHIT, CalcDamageInfo::hitOutCome, SpellInfo::Id, IsAlive(), IsControlledByPlayer(), Creature::IsEvadingAttacks(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), IsVehicle(), Creature::isWorldBoss(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_GLANCING, MELEE_HIT_NORMAL, OFF_ATTACK, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::resist, roll_chance_f(), WorldObject::SendMessageToSet(), SendSpellDamageImmune(), SendSpellMiss(), setAttackTimer(), SMSG_SPELLDAMAGESHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_DIRECT_DAMAGE, SpellDamageBonusTaken(), SpellHitResult(), sWorld, CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_STATE_IN_FLIGHT, VICTIMSTATE_BLOCKS, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ DealSpellDamage()

void Unit::DealSpellDamage ( SpellNonMeleeDamage damageInfo,
bool  durabilityLoss,
Spell const *  spell = nullptr 
)
1423{
1424 if (damageInfo == 0)
1425 return;
1426
1427 Unit* victim = damageInfo->target;
1428
1429 if (!victim)
1430 return;
1431
1432 if (!victim->IsAlive() || victim->IsInFlight() || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks()))
1433 return;
1434
1435 SpellInfo const* spellProto = damageInfo->spellInfo;
1436 if (!spellProto)
1437 {
1438 LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo");
1439 return;
1440 }
1441
1442 // Call default DealDamage
1443 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
1444 Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);
1445}
SpellInfo const * spellInfo
Definition: Unit.h:497
bool IsInFlight() const
Definition: Unit.h:1019

References SpellNonMeleeDamage::absorb, BASE_ATTACK, SpellNonMeleeDamage::cleanDamage, SpellNonMeleeDamage::damage, DealDamage(), Object::GetTypeId(), IsAlive(), Creature::IsEvadingAttacks(), IsInFlight(), LOG_DEBUG, MELEE_HIT_NORMAL, SpellNonMeleeDamage::schoolMask, SPELL_DIRECT_DAMAGE, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToCreature(), and TYPEID_UNIT.

Referenced by Spell::DoAllEffectOnTarget(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ DelayOwnedAuras()

void Unit::DelayOwnedAuras ( uint32  spellId,
ObjectGuid  caster,
int32  delaytime 
)
5407{
5408 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5409 for (; range.first != range.second; ++range.first)
5410 {
5411 Aura* aura = range.first->second;
5412 if (!caster || aura->GetCasterGUID() == caster)
5413 {
5414 if (aura->GetDuration() < delaytime)
5415 aura->SetDuration(0);
5416 else
5417 aura->SetDuration(aura->GetDuration() - delaytime);
5418
5419 // update for out of range group members (on 1 slot use)
5421 LOG_DEBUG("spells.aura", "Aura {} partially interrupted on unit {}, new duration: {} ms", aura->GetId(), GetGUID().ToString(), aura->GetDuration());
5422 }
5423 }
5424}
std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
Definition: Unit.h:637
int32 GetDuration() const
Definition: SpellAuras.h:133
void SetNeedClientUpdateForTargets() const
Definition: SpellAuras.cpp:1258
void SetDuration(int32 duration, bool withMods=false)
Definition: SpellAuras.cpp:868

References Aura::GetCasterGUID(), Aura::GetDuration(), Object::GetGUID(), Aura::GetId(), LOG_DEBUG, m_ownedAuras, Aura::SetDuration(), Aura::SetNeedClientUpdateForTargets(), and Position::ToString().

◆ DeleteCharmInfo()

void Unit::DeleteCharmInfo ( )
15734{
15735 if (!m_charmInfo)
15736 return;
15737
15739 delete m_charmInfo;
15740 m_charmInfo = nullptr;
15741}
void RestoreState()
Definition: CharmInfo.cpp:46

References m_charmInfo, and CharmInfo::RestoreState().

Referenced by RemoveCharmedBy().

◆ DeMorph()

void Unit::DeMorph ( )
4308{
4310}
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition: Unit.cpp:16676
uint32 GetNativeDisplayId() const
Definition: Unit.h:1512

References GetNativeDisplayId(), and SetDisplayId().

Referenced by modify_commandscript::HandleMorphResetCommand().

◆ DisableRotate()

void Unit::DisableRotate ( bool  apply)
18179{
18180 if (GetTypeId() != TYPEID_UNIT)
18181 return;
18182
18183 if (apply)
18187}
@ UNIT_STATE_POSSESSED
Definition: UnitDefines.h:165
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:825

References Object::GetTypeId(), HasUnitState(), RemoveUnitFlag(), SetUnitFlag(), TYPEID_UNIT, UNIT_FLAG_POSSESSED, and UNIT_STATE_POSSESSED.

Referenced by boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_anub_arak::boss_anub_arakAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::Reset(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ DisableSpline()

◆ Dismount()

void Unit::Dismount ( )
13446{
13447 if (!IsMounted())
13448 return;
13449
13452
13453 if (Player* thisPlayer = ToPlayer())
13454 {
13455 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13456 data << GetPackGUID();
13457 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13458 data << thisPlayer->GetCollisionHeight();
13459 thisPlayer->GetSession()->SendPacket(&data);
13460 }
13461
13462 WorldPacket data(SMSG_DISMOUNT, 8);
13463 data << GetPackGUID();
13464 SendMessageToSet(&data, true);
13465
13466 // dismount as a vehicle
13467 if (IsPlayer() && GetVehicleKit())
13468 {
13469 // Send other players that we are no longer a vehicle
13470 data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);
13471 data << GetPackGUID();
13472 data << uint32(0);
13473 ToPlayer()->SendMessageToSet(&data, true);
13474 // Remove vehicle from player
13476 }
13477
13479
13480 // only resummon old pet if the player is already added to a map
13481 // this prevents adding a pet to a not created map which would otherwise cause a crash
13482 // (it could probably happen when logging in after a previous crash)
13483 if (Player* player = ToPlayer())
13484 {
13485 sScriptMgr->AnticheatSetUnderACKmount(player);
13486
13487 if (Pet* pPet = player->GetPet())
13488 {
13489 if (pPet->HasUnitFlag(UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED))
13490 pPet->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13491 }
13492 else
13493 player->ResummonPetTemporaryUnSummonedIfAny();
13494
13495 // xinef: if we have charmed npc, remove stun also
13496 if (Unit* charm = player->GetCharm())
13497 if (charm->GetTypeId() == TYPEID_UNIT && !charm->HasUnitState(UNIT_STATE_STUNNED))
13498 charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13499 }
13500}
@ UNIT_FLAG_STUNNED
Definition: UnitDefines.h:247
@ UNIT_FLAG_MOUNT
Definition: UnitDefines.h:256
@ UNIT_FIELD_MOUNTDISPLAYID
Definition: UpdateFields.h:126
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition: SpellDefines.h:50
@ SMSG_PLAYER_VEHICLE_DATA
Definition: Opcodes.h:1221
@ SMSG_MOVE_SET_COLLISION_HGT
Definition: Opcodes.h:1332
@ SMSG_DISMOUNT
Definition: Opcodes.h:970
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition: Player.cpp:5612
void RemoveVehicleKit()
Definition: Unit.cpp:18630

References AURA_INTERRUPT_FLAG_NOT_MOUNTED, GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), IsMounted(), Object::IsPlayer(), RemoveAurasWithInterruptFlags(), RemoveUnitFlag(), RemoveVehicleKit(), WorldObject::SendMessageToSet(), Player::SendMessageToSet(), SetUInt32Value(), SMSG_DISMOUNT, SMSG_MOVE_SET_COLLISION_HGT, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), TYPEID_UNIT, UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, UNIT_FLAG_STUNNED, and UNIT_STATE_STUNNED.

Referenced by _EnterVehicle(), Player::CleanupAfterTaxiFlight(), FlightPathMovementGenerator::DoFinalize(), BattlegroundWS::EventPlayerClickedOnFlag(), AuraEffect::HandleAuraMounted(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), npc_scarlet_courier::npc_scarlet_courierAI::JustEngagedWith(), boss_mandokir::boss_mandokirAI::JustEngagedWith(), boss_captain_skarloc::MovementInform(), spell_chapter5_light_of_dawn_aura::spell_chapter5_light_of_dawn_aura_AuraScript::OnApply(), Creature::setDeathState(), SetInCombatState(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), npc_magister_aledis::StartFight(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ EnergizeBySpell()

void Unit::EnergizeBySpell ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11193{
11194 int32 gainedPower = victim->ModifyPower(powerType, damage, false);
11195
11196 if (powerType != POWER_HAPPINESS && gainedPower)
11197 {
11198 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
11199 victim->getHostileRefMgr().threatAssist(this, float(gainedPower) * 0.5f, spellInfo);
11200 }
11201
11202 SendEnergizeSpellLog(victim, spellID, damage, powerType);
11203}
@ POWER_HAPPINESS
Definition: SharedDefines.h:273
void threatAssist(Unit *victim, float baseThreat, SpellInfo const *threatSpell=nullptr)
Definition: HostileRefMgr.cpp:35
void SendEnergizeSpellLog(Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
Definition: Unit.cpp:11181

References getHostileRefMgr(), ModifyPower(), POWER_HAPPINESS, SendEnergizeSpellLog(), sSpellMgr, and HostileRefMgr::threatAssist().

Referenced by Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerDrain(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ EnterVehicle()

void Unit::EnterVehicle ( Unit base,
int8  seatId = -1 
)
19533{
19535
19536 if (Player* player = ToPlayer())
19537 {
19538 sScriptMgr->AnticheatSetUnderACKmount(player);
19539 }
19540}
@ VEHICLE_SPELL_RIDE_HARDCODED
Definition: VehicleDefines.h:52
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
Definition: SpellDefines.h:144

References CastCustomSpell(), SPELLVALUE_BASE_POINT0, sScriptMgr, Object::ToPlayer(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, and VEHICLE_SPELL_RIDE_HARDCODED.

Referenced by debug_commandscript::HandleDebugEnterVehicleCommand(), WorldSession::HandleEnterPlayerVehicle(), boss_mimiron::boss_mimironAI::JustEngagedWith(), npc_pilgrims_bounty_chair::UpdateAI(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ EnterVehicleUnattackable()

void Unit::EnterVehicleUnattackable ( Unit base,
int8  seatId = -1 
)

◆ ExecuteDelayedUnitAINotifyEvent()

void Unit::ExecuteDelayedUnitAINotifyEvent ( )
20400{
20402 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20403 return;
20404
20405 Acore::AIRelocationNotifier notifier(*this);
20406 float radius = 60.0f;
20407 Cell::VisitAllObjects(this, notifier, radius);
20408}
@ NOTIFY_AI_RELOCATION
Definition: Object.h:66
void RemoveFromNotify(uint16 f)
Definition: Object.h:565
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:207
Definition: GridNotifiers.h:91

References IsDuringRemoveFromWorld(), Object::IsInWorld(), NOTIFY_AI_RELOCATION, WorldObject::RemoveFromNotify(), and Cell::VisitAllObjects().

Referenced by Update().

◆ ExecuteDelayedUnitRelocationEvent()

void Unit::ExecuteDelayedUnitRelocationEvent ( )
20293{
20295 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20296 return;
20297
20298 if (this->HasSharedVision())
20299 for (SharedVisionList::const_iterator itr = this->GetSharedVisionList().begin(); itr != this->GetSharedVisionList().end(); ++itr)
20300 if (Player* player = (*itr))
20301 {
20302 if (player->IsOnVehicle(this) || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) // players on vehicles have their own event executed (due to passenger relocation)
20303 continue;
20304 WorldObject* viewPoint = player;
20305 if (player->m_seer && player->m_seer->IsInWorld())
20306 viewPoint = player->m_seer;
20307 if (!viewPoint->IsPositionValid() || !player->IsPositionValid())
20308 continue;
20309
20310 if (Unit* active = viewPoint->ToUnit())
20311 {
20312 //if (active->IsVehicle()) // always check original unit here, last notify position is not relocated
20313 // active = player;
20314
20315 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20316 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20317 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20318 float distsq = dx * dx + dy * dy + dz * dz;
20319 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20320 if (distsq < mindistsq)
20321 continue;
20322
20323 // this will be relocated below sharedvision!
20324 //active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20325 }
20326
20327 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20328 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20329 relocateNoLarge.SendToSelf();
20330 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20331 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20332 relocateLarge.SendToSelf();
20333 }
20334
20335 if (Player* player = this->ToPlayer())
20336 {
20337 WorldObject* viewPoint = player;
20338 if (player->m_seer && player->m_seer->IsInWorld())
20339 viewPoint = player->m_seer;
20340
20341 if (viewPoint->GetMapId() != player->GetMapId() || !viewPoint->IsPositionValid() || !player->IsPositionValid())
20342 return;
20343
20344 if (Unit* active = viewPoint->ToUnit())
20345 {
20346 if (active->IsVehicle())
20347 active = player;
20348
20349 if (!player->GetFarSightDistance())
20350 {
20351 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20352 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20353 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20354 float distsq = dx * dx + dy * dy + dz * dz;
20355
20356 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20357 if (distsq < mindistsq)
20358 return;
20359
20360 active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20361 }
20362 }
20363
20364 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20365 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20366 relocateNoLarge.SendToSelf();
20367
20368 if (!player->GetFarSightDistance())
20369 {
20370 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20371 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20372 relocateLarge.SendToSelf();
20373 }
20374
20376 }
20377 else if (Creature* unit = this->ToCreature())
20378 {
20379 if (!unit->IsPositionValid())
20380 return;
20381
20382 float dx = unit->m_last_notify_position.GetPositionX() - unit->GetPositionX();
20383 float dy = unit->m_last_notify_position.GetPositionY() - unit->GetPositionY();
20384 float dz = unit->m_last_notify_position.GetPositionZ() - unit->GetPositionZ();
20385 float distsq = dx * dx + dy * dy + dz * dz;
20386 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(unit->FindMap()->GetEntry()->map_type);
20387 if (distsq < mindistsq)
20388 return;
20389
20390 unit->m_last_notify_position.Relocate(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
20391
20392 Acore::CreatureRelocationNotifier relocate(*unit);
20393 Cell::VisitAllObjects(unit, relocate, unit->GetVisibilityRange() + VISIBILITY_COMPENSATION);
20394
20396 }
20397}
#define MAX_VISIBILITY_DISTANCE
Definition: ObjectDefines.h:31
#define VISIBILITY_INC_FOR_GOBJECTS
Definition: ObjectDefines.h:28
#define VISIBILITY_COMPENSATION
Definition: ObjectDefines.h:26
@ NOTIFY_VISIBILITY_CHANGED
Definition: Object.h:67
Unit * ToUnit()
Definition: Object.h:204
void AddToNotify(uint16 f)
Definition: Object.cpp:2973
bool IsPositionValid() const
Definition: Position.cpp:175
uint32 GetMapId() const
Definition: Position.h:276
SharedVisionList const & GetSharedVisionList()
Definition: Unit.h:1231
bool HasSharedVision() const
Definition: Unit.h:1234
Definition: GridNotifiers.h:75
Definition: GridNotifiers.h:83
static float GetReqMoveDistSq(uint32 map_type)
Definition: DynamicVisibility.h:53

References WorldObject::AddToNotify(), WorldLocation::GetMapId(), Position::GetPositionX(), DynamicVisibilityMgr::GetReqMoveDistSq(), GetSharedVisionList(), HasSharedVision(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Position::IsPositionValid(), MAX_VISIBILITY_DISTANCE, NOTIFY_AI_RELOCATION, NOTIFY_VISIBILITY_CHANGED, WorldObject::RemoveFromNotify(), Acore::VisibleNotifier::SendToSelf(), Object::ToCreature(), Object::ToPlayer(), Object::ToUnit(), VISIBILITY_COMPENSATION, VISIBILITY_INC_FOR_GOBJECTS, and Cell::VisitAllObjects().

◆ ExitVehicle()

void Unit::ExitVehicle ( Position const *  exitPosition = nullptr)

This function can be called at upper level code to initialize an exit from the passenger's side.

The following call would not even be executed successfully as the SPELL_AURA_CONTROL_VEHICLE unapply handler already calls _ExitVehicle without specifying an exitposition. The subsequent call below would return on if (!m_vehicle).

To do: We need to allow SPELL_AURA_CONTROL_VEHICLE unapply handlers in spellscripts to specify exit coordinates and either store those per passenger, or we need to init spline movement based on those coordinates in unapply handlers, and relocate exiting passengers based on Unit::moveSpline data. Either way, Coming Soon(TM)

19629{
19631 if (!m_vehicle)
19632 return;
19633
19635 if (Player* player = ToPlayer())
19636 {
19637 player->SetCanTeleport(true);
19638 }
19642 /*_ExitVehicle(exitPosition);*/
19649
19650 if (Player* player = ToPlayer())
19651 {
19652 sScriptMgr->AnticheatSetUnderACKmount(player);
19653 }
19654}
Unit * GetVehicleBase() const
Definition: Unit.cpp:18645

References Object::GetGUID(), GetVehicleBase(), m_vehicle, RemoveAurasByType(), SPELL_AURA_CONTROL_VEHICLE, sScriptMgr, and Object::ToPlayer().

Referenced by _EnterVehicle(), Player::ActivateTaxiPathTo(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), WorldSession::HandleDismissControlledVehicle(), spell_warhead_detonate::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_ulduar_squeezed_lifeless::HandleInstaKill(), WorldSession::HandleRequestVehicleExit(), spell_vehicle_throw_passenger::HandleScript(), boss_kologarn_arms::boss_kologarn_armsAI::JustDied(), Player::ProcessDelayedOperations(), RemoveFromWorld(), Player::StopCastingCharm(), and Player::TeleportTo().

◆ FindCurrentSpellBySpellId()

◆ FinishSpell()

void Unit::FinishSpell ( CurrentSpellTypes  spellType,
bool  ok = true 
)
4046{
4047 Spell* spell = m_currentSpells[spellType];
4048 if (!spell)
4049 return;
4050
4051 if (spellType == CURRENT_CHANNELED_SPELL)
4052 spell->SendChannelUpdate(0);
4053
4054 spell->finish(ok);
4055}
void SendChannelUpdate(uint32 time)
Definition: Spell.cpp:5181

References CURRENT_CHANNELED_SPELL, Spell::finish(), m_currentSpells, and Spell::SendChannelUpdate().

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), npc_risen_archmage::npc_risen_archmageAI::JustEngagedWith(), boss_lord_marrowgar::UpdateAI(), and GameObject::Use().

◆ GetAffectingPlayer()

Player * Unit::GetAffectingPlayer ( ) const
10552{
10553 if (!GetCharmerOrOwnerGUID())
10554 return const_cast<Unit*>(this)->ToPlayer();
10555
10556 if (Unit* owner = GetCharmerOrOwner())
10558
10559 return nullptr;
10560}
Unit * GetCharmerOrOwner() const
Definition: Unit.h:1189
ObjectGuid GetCharmerOrOwnerGUID() const
Definition: Unit.h:1172

References GetCharmerOrOwner(), GetCharmerOrOwnerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), and Object::ToPlayer().

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), GetFactionReactionTo(), and GetReactionTo().

◆ GetAI()

UnitAI * Unit::GetAI ( )
inline
656{ return i_AI; }

References i_AI.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), spell_algalon_big_bang::CheckTargets(), DealDamage(), DealHeal(), spell_send_mug_target_picker::FilterTargets(), spell_blood_queen_bloodbolt::FilterTargets(), npc_dream_fog::npc_dream_fogAI::GetRandomUnitFromDragonThreatList(), spell_kaelthas_resurrection::HandleBeforeCast(), BattlegroundIC::HandleCapturedNodes(), spell_send_mug_target_picker::HandleDummy(), spell_magtheridon_shadow_grasp_visual::HandleDummyApply(), spell_mount_check_aura::HandleEffectPeriodic(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_random_aggro::HandleOnHit(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_ayamiss_swarmer_start_loop::HandleScript(), spell_pursue::HandleScript(), spell_xt002_gravity_bomb_damage::HandleScript(), spell_the_lich_king_quake::HandleSendEvent(), npc_risen_guardian::npc_risen_guardianAI::IsSummonedBy(), npc_risen_guardian::npc_risen_guardianAI::KilledUnit(), ModifyPower(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), achievement_respect_your_elders::OnCheck(), achievement_hadronox_denied::OnCheck(), achievement_watch_him_die::OnCheck(), achievement_better_off_dred::OnCheck(), achievement_oh_novos::OnCheck(), achievement_share_the_love::OnCheck(), achievement_snakes_whyd_it_have_to_be_snakes::OnCheck(), achievement_im_on_a_boat::OnCheck(), achievement_all_you_can_eat::OnCheck(), achievement_been_waiting_long_time::OnCheck(), achievement_neck_deep_in_vile::OnCheck(), achievement_portal_jockey::OnCheck(), achievement_chaos_theory::OnCheck(), achievement_split_personality::OnCheck(), achievement_algalon_he_feeds_on_your_tears::OnCheck(), achievement_algalon_herald_of_the_titans::OnCheck(), achievement_flame_leviathan_towers::OnCheck(), achievement_flame_leviathan_shutout::OnCheck(), achievement_freya_getting_back_to_nature::OnCheck(), achievement_freya_knock_on_wood::OnCheck(), achievement_yogg_saron_drive_me_crazy::OnCheck(), achievement_yogg_saron_kiss_and_make_up::OnCheck(), achievement_intense_cold::OnCheck(), achievement_once_bitten_twice_shy::OnCheck(), spell_xt002_gravity_bomb_aura::OnPeriodic(), spell_marrowgar_coldflame::SelectTarget(), and boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::SpellHit().

◆ GetAllMinionsByEntry()

void Unit::GetAllMinionsByEntry ( std::list< Creature * > &  Minions,
uint32  entry 
)
10773{
10774 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10775 {
10776 Unit* unit = *itr;
10777 ++itr;
10778 if (unit->GetEntry() == entry && unit->GetTypeId() == TYPEID_UNIT
10779 && unit->ToCreature()->IsSummon()) // minion, actually
10780 Minions.push_back(unit->ToCreature());
10781 }
10782}
bool IsSummon() const
Definition: Unit.h:750

References Object::GetEntry(), Object::GetTypeId(), IsSummon(), m_Controlled, Object::ToCreature(), and TYPEID_UNIT.

Referenced by spell_item_gift_of_the_harvester::spell_item_gift_of_the_harvester_SpellScript::CheckRequirement().

◆ GetAPMultiplier()

float Unit::GetAPMultiplier ( WeaponAttackType  attType,
bool  normalized 
)
17133{
17134 if (!normalized || GetTypeId() != TYPEID_PLAYER)
17135 return float(GetAttackTime(attType)) / 1000.0f;
17136
17137 Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
17138 if (!Weapon)
17139 return 2.4f; // fist attack
17140
17141 switch (Weapon->GetTemplate()->InventoryType)
17142 {
17143 case INVTYPE_2HWEAPON:
17144 return 3.3f;
17145 case INVTYPE_RANGED:
17147 case INVTYPE_THROWN:
17148 return 2.8f;
17149 case INVTYPE_WEAPON:
17152 default:
17153 return Weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
17154 }
17155}
Weapon
Definition: boss_arlokk.cpp:76
@ ITEM_SUBCLASS_WEAPON_DAGGER
Definition: ItemTemplate.h:367
@ INVTYPE_RANGED
Definition: ItemTemplate.h:279
@ INVTYPE_THROWN
Definition: ItemTemplate.h:289
@ INVTYPE_RANGEDRIGHT
Definition: ItemTemplate.h:290
@ INVTYPE_WEAPON
Definition: ItemTemplate.h:277
@ INVTYPE_WEAPONMAINHAND
Definition: ItemTemplate.h:285
@ INVTYPE_WEAPONOFFHAND
Definition: ItemTemplate.h:286
@ INVTYPE_2HWEAPON
Definition: ItemTemplate.h:281
Definition: Item.h:220
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition: PlayerStorage.cpp:511

References GetAttackTime(), Object::GetTypeId(), Player::GetWeaponForAttack(), INVTYPE_2HWEAPON, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, ITEM_SUBCLASS_WEAPON_DAGGER, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and MeleeDamageBonusDone().

◆ GetAppliedAuras() [1/2]

◆ GetAppliedAuras() [2/2]

AuraApplicationMap const & Unit::GetAppliedAuras ( ) const
inline
1267{ return m_appliedAuras; }

References m_appliedAuras.

◆ GetArmor()

◆ getAttackerForHelper()

Unit * Unit::getAttackerForHelper ( ) const
inline
707 {
708 if (GetVictim() != nullptr)
709 return GetVictim();
710
711 if (!IsEngaged())
712 return nullptr;
713
714 if (!m_attackers.empty())
715 return *(m_attackers.begin());
716
717 return nullptr;
718 }
bool IsEngaged() const
Definition: Unit.h:1028
Unit * GetVictim() const
Definition: Unit.h:726

References GetVictim(), IsEngaged(), and m_attackers.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), PetAI::SelectNextTarget(), Creature::SelectVictim(), SetControlled(), TotemAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and PetAI::UpdateAI().

◆ getAttackers()

◆ GetAttackTime()

◆ getAttackTimer()

◆ GetAura()

Aura * Unit::GetAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5526{
5527 AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask);
5528 return aurApp ? aurApp->GetBase() : nullptr;
5529}
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition: Unit.cpp:5506

References GetAuraApplication(), and AuraApplication::GetBase().

Referenced by Player::_addSpell(), Pet::addSpell(), spell_mage_burning_determination::CheckProc(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_freya::boss_freyaAI::DoAction(), Spell::DoTriggersOnSpellHit(), Spell::EffectScriptEffect(), Spell::EffectTitanGrip(), Spell::EffectWeaponDmg(), getOrphanGUID(), spell_dk_scourge_strike::HandleAfterHit(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleAuraStacksCommand(), deserter_commandscript::HandleDeserterAdd(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_charge_shield_bomber::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), HandleDummyAuraProc(), spell_yogg_saron_sanity_well_aura::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_sindragosa_frost_breath::HandleInfusion(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_putricide_unstable_experiment::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_pal_seal_of_vengeance::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), npc_gunship::npc_gunshipAI::JustDied(), npc_brew_bubble::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), spell_summoning_rhyme_aura::PeriodicTick(), Player::ProcessDelayedOperations(), BattlefieldWG::PromotePlayer(), RemoveAurasDueToSpellBySteal(), Player::ResurrectPlayer(), SetAuraStack(), boss_anomalus::boss_anomalusAI::SetData(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_pilgrims_bounty_chair::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_sindragosa::boss_sindragosaAI::SpellHitTarget(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::SpellHitTarget(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::SpellHitTarget(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ GetAuraApplication()

AuraApplication * Unit::GetAuraApplication ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5507{
5508 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5509 for (; range.first != range.second; ++range.first)
5510 {
5511 AuraApplication* app = range.first->second;
5512 Aura const* aura = app->GetBase();
5513
5514 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5515 && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5516 && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
5517 && (!except || except != app))
5518 {
5519 return app;
5520 }
5521 }
5522 return nullptr;
5523}
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition: Unit.h:640
uint8 GetEffectMask() const
Definition: SpellAuras.h:176
ObjectGuid GetCastItemGUID() const
Definition: SpellAuras.h:103

References AuraApplication::GetBase(), Aura::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetEffectMask(), and m_appliedAuras.

Referenced by AuraApplication::_Remove(), GetAura(), GetAuraApplicationOfRankedSpell(), HasAura(), and Spell::UpdateChanneledTargetList().

◆ GetAuraApplicationOfRankedSpell()

AuraApplication * Unit::GetAuraApplicationOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5532{
5533 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5534 while (rankSpell)
5535 {
5536 if (AuraApplication* aurApp = GetAuraApplication(rankSpell, casterGUID, itemCasterGUID, reqEffMask, except))
5537 return aurApp;
5538 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5539 }
5540 return nullptr;
5541}

References GetAuraApplication(), and sSpellMgr.

Referenced by spell_warl_drain_soul::CheckProc(), and GetAuraOfRankedSpell().

◆ GetAuraCount()

uint32 Unit::GetAuraCount ( uint32  spellId) const
5627{
5628 uint32 count = 0;
5629 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5630
5631 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5632 {
5633 if (itr->second->GetBase()->GetStackAmount() == 0)
5634 ++count;
5635 else
5636 count += (uint32)itr->second->GetBase()->GetStackAmount();
5637 }
5638
5639 return count;
5640}

References m_appliedAuras.

Referenced by npc_brew_bubble::MoveInLineOfSight(), spell_valithria_suppression_aura::OnApply(), achievement_consumption_junction::OnCheck(), achievement_assembly_of_iron::OnCheck(), achievement_cant_do_that_while_stunned::OnCheck(), spell_valithria_suppression_aura::OnRemove(), SmartScript::ProcessEvent(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), spell_black_temple_spell_absorption_aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ GetAuraEffect() [1/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5479{
5480 AuraEffectList const& auras = GetAuraEffectsByType(type);
5481 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5482 {
5483 SpellInfo const* spell = (*i)->GetSpellInfo();
5484 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5485 {
5486 if (casterGUID && (*i)->GetCasterGUID() != casterGUID)
5487 continue;
5488 return (*i);
5489 }
5490 }
5491 return nullptr;
5492}
bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition: Util.h:468
flag96 SpellFamilyFlags
Definition: SpellInfo.h:388
uint32 SpellFamilyName
Definition: SpellInfo.h:387

References GetAuraEffectsByType(), flag96::HasFlag(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

◆ GetAuraEffect() [2/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  name,
uint32  iconId,
uint8  effIndex 
) const
5465{
5466 AuraEffectList const& auras = GetAuraEffectsByType(type);
5467 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5468 {
5469 if (effIndex != (*itr)->GetEffIndex())
5470 continue;
5471 SpellInfo const* spell = (*itr)->GetSpellInfo();
5472 if (spell->SpellIconID == iconId && spell->SpellFamilyName == name)
5473 return *itr;
5474 }
5475 return nullptr;
5476}
uint32 SpellIconID
Definition: SpellInfo.h:380

References GetAuraEffectsByType(), SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

◆ GetAuraEffect() [3/3]

AuraEffect * Unit::GetAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5439{
5440 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5441 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5442 {
5443 if (itr->second->HasEffect(effIndex)
5444 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5445 {
5446 return itr->second->GetBase()->GetEffect(effIndex);
5447 }
5448 }
5449 return nullptr;
5450}

References m_appliedAuras.

Referenced by CalculateSpellAmount(), Spell::CanAutoCast(), spell_mage_ice_barrier::CheckCast(), spell_pri_power_word_shield::CheckCast(), spell_mage_molten_armor::CheckProc(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectWeaponDmg(), spell_dru_t10_restoration_4p_bonus::FilterTargets(), GetAuraEffectOfRankedSpell(), GetDummyAuraEffect(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_dk_raise_ally::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_warr_execute::HandleEffect(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pri_divine_aegis::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleShapeshiftBoosts(), spell_warl_drain_soul::HandleTick(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), Guardian::InitStatsForLevel(), npc_anzu_spirit::IsSummonedBy(), MeleeDamageBonusDone(), ModSpellDuration(), spell_dk_death_and_decay::RecalculateDamage(), RemoveAurasDueToSpellByDispel(), SpellDamageBonusDone(), SpellHealingBonusTaken(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), and npc_hallows_end_train_fire::UpdateAI().

◆ GetAuraEffectDummy()

AuraEffect * Unit::GetAuraEffectDummy ( uint32  spellid) const
5495{
5497 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5498 {
5499 if ((*itr)->GetId() == spellid)
5500 return *itr;
5501 }
5502
5503 return nullptr;
5504}
@ SPELL_AURA_DUMMY
Definition: SpellAuraDefines.h:67

References GetAuraEffectsByType(), and SPELL_AURA_DUMMY.

Referenced by Spell::EffectWeaponDmg(), Aura::HandleAuraSpecificMods(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), Guardian::InitStatsForLevel(), Kill(), spell_dk_death_and_decay::RecalculateDamage(), Player::RemoveSpellMods(), and SpellHealingBonusTaken().

◆ GetAuraEffectOfRankedSpell()

AuraEffect * Unit::GetAuraEffectOfRankedSpell ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5453{
5454 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5455 while (rankSpell)
5456 {
5457 if (AuraEffect* aurEff = GetAuraEffect(rankSpell, effIndex, caster))
5458 return aurEff;
5459 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5460 }
5461 return nullptr;
5462}
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition: Unit.cpp:5438

References GetAuraEffect(), and sSpellMgr.

Referenced by spell_mage_fire_frost_ward::Absorb(), spell_sha_earthbind_totem::Apply(), spell_sha_earthliving_weapon::CheckProc(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), SpellPctDamageModsDone(), and spell_mage_incanters_absorbtion_base_AuraScript::Trigger().

◆ GetAuraEffectsByType()

AuraEffectList const & Unit::GetAuraEffectsByType ( AuraType  type) const
inline
1309{ return m_modAuras[type]; }

References m_modAuras.

Referenced by Player::_ApplyWeaponDependentAuraMods(), Spell::_cast(), AuraApplication::_HandleEffect(), KillRewarder::_RewardXP(), CalcAbsorbResist(), CalcArmorReducedDamage(), CalcHealAbsorb(), AuraEffect::CalculateAmount(), Player::CalculateQuestRewardXP(), Spell::CheckCast(), Spell::CheckCasterAuras(), DealDamage(), DealMeleeDamage(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), spell_dk_wandering_plague::FilterTargets(), GetAuraEffect(), GetAuraEffectDummy(), GetDoTsByCaster(), GetMagicHitRedirectTarget(), GetMaxNegativeAuraModifier(), GetMaxNegativeAuraModifierByAffectMask(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifier(), GetMaxPositiveAuraModifierByAffectMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscValue(), Player::getMaxTimer(), GetMeleeHitRedirectTarget(), GetPhaseByAuras(), Player::GetResurrectionSpellId(), Player::GetRuneBaseCooldown(), GetTotalAuraModifier(), GetTotalAuraModifierAreaExclusive(), GetTotalAuraModifierByAffectMask(), GetTotalAuraModifierByMiscMask(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByAffectMask(), GetTotalAuraMultiplierByMiscMask(), GetTotalAuraMultiplierByMiscValue(), GetUnitCriticalChance(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), AuraEffect::HandleAuraTransform(), AuraEffect::HandleDetectAmore(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), HandleDummyAuraProc(), Spell::HandleLaunchPhase(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), spell_illidari_council_judgement::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HasAuraState(), HasAuraTypeWithAffectMask(), HasAuraTypeWithCaster(), HasAuraTypeWithFamilyFlags(), HasAuraTypeWithMiscvalue(), HasAuraTypeWithTriggerSpell(), HasAuraTypeWithValue(), HasBreakableByDamageAuraType(), HasVisibleAuraType(), IsImmunedToSpellEffect(), IsScriptOverriden(), SpellInfo::IsStrongerAuraActive(), Player::isTotalImmune(), list_commandscript::ListAurasCommand(), MeleeDamageBonusDone(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Spell::PrepareTriggersExecutedOnHit(), processDummyAuras(), spell_dru_enrage::RecalculateBaseArmor(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::Respawn(), RestoreDisplayId(), Spell::SelectImplicitAreaTargets(), Spell::SelectImplicitConeTargets(), PetAI::SelectNextTarget(), Creature::SelectVictim(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetEntryPoint(), Player::SetSkill(), SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SpellBaseHealingBonusDone(), SpellBaseHealingBonusTaken(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), SpellHealingBonusTaken(), SpellHitResult(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), Player::SummonPet(), Player::TeleportTo(), SimpleCharmedAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), Player::UpdateArmor(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCharmedAI(), Player::UpdateExpertise(), Player::UpdateManaRegen(), Player::UpdateRating(), Player::UpdateResistances(), UpdateSpeed(), and Player::UpdateStats().

◆ GetAuraOfRankedSpell()

Aura * Unit::GetAuraOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5544{
5545 AuraApplication* aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask);
5546 return aurApp ? aurApp->GetBase() : nullptr;
5547}
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition: Unit.cpp:5531

References GetAuraApplicationOfRankedSpell(), and AuraApplication::GetBase().

Referenced by Aura::HandleAuraSpecificMods().

◆ GetCastingTimeForBonus()

uint32 Unit::GetCastingTimeForBonus ( SpellInfo const *  spellProto,
DamageEffectType  damagetype,
uint32  CastingTime 
) const
16993{
16994 // Not apply this to creature casted spells with casttime == 0
16995 if (CastingTime == 0 && GetTypeId() == TYPEID_UNIT && !IsPet())
16996 return 3500;
16997
16998 if (CastingTime > 7000) CastingTime = 7000;
16999 if (CastingTime < 1500) CastingTime = 1500;
17000
17001 if (damagetype == DOT && !spellProto->IsChanneled())
17002 CastingTime = 3500;
17003
17004 int32 overTime = 0;
17005 uint8 effects = 0;
17006 bool DirectDamage = false;
17007 bool AreaEffect = false;
17008
17009 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++)
17010 {
17011 switch (spellProto->Effects[i].Effect)
17012 {
17018 case SPELL_EFFECT_HEAL:
17019 DirectDamage = true;
17020 break;
17022 switch (spellProto->Effects[i].ApplyAuraName)
17023 {
17027 if (spellProto->GetDuration())
17028 overTime = spellProto->GetDuration();
17029 break;
17030 default:
17031 // -5% per additional effect
17032 ++effects;
17033 break;
17034 }
17035 default:
17036 break;
17037 }
17038
17039 if (spellProto->Effects[i].IsTargetingArea())
17040 AreaEffect = true;
17041 }
17042
17043 // Combined Spells with Both Over Time and Direct Damage
17044 if (overTime > 0 && DirectDamage)
17045 {
17046 // mainly for DoTs which are 3500 here otherwise
17047 uint32 OriginalCastTime = spellProto->CalcCastTime();
17048 if (OriginalCastTime > 7000) OriginalCastTime = 7000;
17049 if (OriginalCastTime < 1500) OriginalCastTime = 1500;
17050 // Portion to Over Time
17051 float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
17052
17053 if (damagetype == DOT)
17054 CastingTime = uint32(CastingTime * PtOT);
17055 else if (PtOT < 1.0f)
17056 CastingTime = uint32(CastingTime * (1 - PtOT));
17057 else
17058 CastingTime = 0;
17059 }
17060
17061 // Area Effect Spells receive only half of bonus
17062 if (AreaEffect)
17063 CastingTime /= 2;
17064
17065 // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
17066 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
17067 {
17068 if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH ||
17069 (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
17070 {
17071 CastingTime /= 2;
17072 break;
17073 }
17074 }
17075
17076 // -5% of total per any additional effect
17077 for (uint8 i = 0; i < effects; ++i)
17078 CastingTime *= 0.95f;
17079
17080 return CastingTime;
17081}
@ SPELL_AURA_PERIODIC_DAMAGE
Definition: SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_HEAL
Definition: SpellAuraDefines.h:71
@ SPELL_AURA_PERIODIC_LEECH
Definition: SpellAuraDefines.h:116
@ SPELL_EFFECT_POWER_BURN
Definition: SharedDefines.h:840
@ SPELL_EFFECT_HEALTH_LEECH
Definition: SharedDefines.h:787
@ SPELL_EFFECT_HEAL
Definition: SharedDefines.h:788
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
Definition: SharedDefines.h:785
@ SPELL_EFFECT_POWER_DRAIN
Definition: SharedDefines.h:786
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition: SharedDefines.h:780
@ SPELL_EFFECT_APPLY_AURA
Definition: SharedDefines.h:784

References SpellInfo::CalcCastTime(), DOT, SpellInfo::Effects, SpellInfo::GetDuration(), Object::GetTypeId(), SpellInfo::IsChanneled(), IsPet(), MAX_SPELL_EFFECTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_EFFECT_APPLY_AURA, SPELL_EFFECT_ENVIRONMENTAL_DAMAGE, SPELL_EFFECT_HEAL, SPELL_EFFECT_HEALTH_LEECH, SPELL_EFFECT_POWER_BURN, SPELL_EFFECT_POWER_DRAIN, SPELL_EFFECT_SCHOOL_DAMAGE, and TYPEID_UNIT.

Referenced by CalculateDefaultCoefficient().

◆ GetCharm()

Unit * Unit::GetCharm ( ) const
10593{
10594 if (ObjectGuid charm_guid = GetCharmGUID())
10595 {
10596 if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
10597 return pet;
10598
10599 LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature {} not exist.", charm_guid.ToString());
10601 }
10602
10603 return nullptr;
10604}
@ UNIT_FIELD_CHARM
Definition: UpdateFields.h:86
Unit * GetUnit(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:202
void SetGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:723
ObjectGuid GetCharmGUID() const
Definition: Unit.h:1164

References ObjectGuid::Empty, GetCharmGUID(), ObjectAccessor::GetUnit(), LOG_ERROR, Object::SetGuidValue(), and UNIT_FIELD_CHARM.

Referenced by Spell::_cast(), AddPetAura(), spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Dismount(), Spell::finish(), GetFirstControlled(), spell_warl_eye_of_kilrogg::HandleAuraApply(), spell_warl_eye_of_kilrogg::HandleAuraRemove(), spell_dk_raise_ally::HandleDummy(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), WorldSession::HandleRequestPetInfo(), isPossessing(), Mount(), Player::PossessSpellInitialize(), RemovePetAura(), Spell::SelectImplicitCasterObjectTargets(), SetSpeed(), npc_pilgrims_bounty_chair::SpellHitTarget(), and Player::StopCastingCharm().

◆ GetCharmer()

◆ GetCharmerGUID()

◆ GetCharmerOrOwner()

◆ GetCharmerOrOwnerGUID()

◆ GetCharmerOrOwnerOrOwnGUID()

◆ GetCharmerOrOwnerOrSelf()

Unit * Unit::GetCharmerOrOwnerOrSelf ( ) const
inline
1191 {
1192 if (Unit* u = GetCharmerOrOwner())
1193 return u;
1194
1195 return (Unit*)this;
1196 }

References GetCharmerOrOwner().

Referenced by CombatStart(), CombatStartOnCast(), GetPartyMembers(), GetReactionTo(), IsInPartyWith(), IsInRaidWith(), SetInCombatWith(), and TotemAI::UpdateAI().

◆ GetCharmerOrOwnerPlayerOrPlayerItself()

Player * Unit::GetCharmerOrOwnerPlayerOrPlayerItself ( ) const
10543{
10545 if (guid.IsPlayer())
10546 return ObjectAccessor::GetPlayer(*this, guid);
10547
10548 return const_cast<Unit*>(this)->ToPlayer();
10549}
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:223

References GetCharmerOrOwnerGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), and Object::ToPlayer().

Referenced by Spell::_handle_finish_phase(), spell_sha_earthbind_totem::Apply(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), BuildValuesUpdate(), spell_q12237_rescue_villager::CheckCast(), spell_q12237_drop_off_villager::CheckCast(), CombatStart(), CombatStartOnCast(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), DealDamage(), Spell::EffectGameObjectSetDestructionState(), Spell::EffectKillCredit(), Spell::EffectKillCreditPersonal(), Spell::EffectSummonPet(), GetAffectingPlayer(), Object::GetUpdateFieldData(), spell_gen_charmed_unit_spell_cooldown::HandleCast(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_q12851_going_bearback::HandleEffectApply(), spell_q12726_song_of_wind_and_water::HandleHealPct(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q10769_dissension_amongst_the_ranks::HandleScriptEffect(), npc_pet_gen_valkyr_guardian::InitializeAI(), isTargetableForAttack(), GuardAI::JustDied(), boss_kurinnaxx::JustDied(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_four_car_garage::npc_four_car_garageAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), Kill(), Condition::Meets(), GameObject::ModifyHealth(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), Pet::RemoveSpellCooldown(), Spell::SendSpellCooldown(), SetCharm(), SetContestedPvP(), SetInCombatState(), Creature::SetLootRecipient(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::SpellHit(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), and Creature::UpdateEntry().

◆ GetCharmGUID()

◆ GetCharmInfo()

◆ getClass()

uint8 Unit::getClass ( ) const
inline
764{ return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
@ UNIT_FIELD_BYTES_0
Definition: UpdateFields.h:95
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition: Object.cpp:323

References Object::GetByteValue(), and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), ArenaTeam::AddMember(), SpellEffectInfo::CalcValue(), getClassMask(), GetDebugInfo(), Player::GetDodgeFromAgility(), SocialMgr::GetFriendInfo(), Player::GetMeleeCritFromAgility(), Player::GetMissPercentageFromDefence(), Player::GetPlayerName(), Player::GetRatingMultiplier(), Player::GetSpec(), Player::GetSpellCritFromIntellect(), Player::GetStartPosition(), Player::GiveLevel(), spell_item_flask_of_the_north::HandleDummy(), HandleDummyAuraProc(), learn_commandscript::HandleLearnAllMySpellsCommand(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), HandleProcTriggerSpell(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDataForForm(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Player::IsClass(), IsClass(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), ClassCallSelector::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), Player::RewardHonor(), Guild::Member::SetStats(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Player::StoreNewItemInBestSlots(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), Player::UpdateDodgePercentage(), Player::UpdateParryPercentage(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getClassMask()

◆ GetCollisionHeight()

float Unit::GetCollisionHeight ( ) const
overridevirtual

Return collision height sent to client.

Reimplemented from WorldObject.

20986{
20987 float scaleMod = GetObjectScale(); // 99% sure about this
20988 float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
20989
20990 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
20991 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
20992 float collisionHeight = 0.0f;
20993
20994 if (IsMounted())
20995 {
20997 {
20998 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
20999 {
21000 collisionHeight = scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * modelData->Scale * displayInfo->scale * 0.5f);
21001 }
21002 }
21003 }
21004 else
21005 collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
21006
21007 return collisionHeight == 0.0f ? defaultHeight : collisionHeight;
21008}
#define DEFAULT_COLLISION_HEIGHT
Definition: ObjectDefines.h:50
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
float GetObjectScale() const
Definition: Object.h:115
Definition: DBCStructure.h:721
uint32 ModelId
Definition: DBCStructure.h:723
float scale
Definition: DBCStructure.h:726
Definition: DBCStructure.h:775
float Scale
Definition: DBCStructure.h:779
float CollisionHeight
Definition: DBCStructure.h:790

References CreatureModelDataEntry::CollisionHeight, DEFAULT_COLLISION_HEIGHT, GetNativeDisplayId(), Object::GetObjectScale(), Object::GetUInt32Value(), IsMounted(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by DynObjAura::FillTargetMap(), WorldObject::GetNearPoint(), GetRandomContactPoint(), WorldSession::HandleMovementOpcodes(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Spell::SelectImplicitCasterDestTargets(), spell_spawn_blood_pool::SetDest(), WorldObject::UpdateAllowedPositionZ(), and Creature::UpdateMovementFlags().

◆ GetCollisionRadius()

float Unit::GetCollisionRadius ( ) const
overridevirtual

this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the radius also takes in consideration the mount size

Returns
float The radius of a unit

Reimplemented from WorldObject.

20980{
20981 return GetCollisionWidth() / 2;
20982}
float GetCollisionWidth() const override
this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by...
Definition: Unit.cpp:20942

References GetCollisionWidth().

Referenced by GetMeleeAttackPoint(), and Creature::Update().

◆ GetCollisionWidth()

float Unit::GetCollisionWidth ( ) const
overridevirtual

this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the diameter also takes in consideration the mount size

Returns
float The diameter of a unit

Dismounting case - use basic default model data

Reimplemented from WorldObject.

20943{
20944 if (IsPlayer())
20945 return GetObjectSize();
20946
20947 float scaleMod = GetObjectScale(); // 99% sure about this
20948 float objectSize = GetObjectSize();
20949 float defaultSize = DEFAULT_WORLD_OBJECT_SIZE * scaleMod;
20950
20952 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
20953 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
20954
20955 if (IsMounted())
20956 {
20958 {
20959 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
20960 {
20961 if (G3D::fuzzyGt(mountModelData->CollisionWidth, modelData->CollisionWidth))
20962 modelData = mountModelData;
20963 }
20964 }
20965 }
20966
20967 float collisionWidth = scaleMod * modelData->CollisionWidth * modelData->Scale * displayInfo->scale * 2;
20968 // if the objectSize is the default value or the creature is mounted and we have a DBC value, then we can retrieve DBC value instead
20969 return G3D::fuzzyGt(collisionWidth, 0.0f) && (G3D::fuzzyEq(objectSize,defaultSize) || IsMounted()) ? collisionWidth : objectSize;
20970}
#define DEFAULT_WORLD_OBJECT_SIZE
Definition: ObjectDefines.h:45
float GetObjectSize() const
Definition: Object.cpp:2768
float CollisionWidth
Definition: DBCStructure.h:789

References CreatureModelDataEntry::CollisionWidth, DEFAULT_WORLD_OBJECT_SIZE, GetNativeDisplayId(), Object::GetObjectScale(), WorldObject::GetObjectSize(), Object::GetUInt32Value(), IsMounted(), Object::IsPlayer(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by GetCollisionRadius().

◆ GetCombatRatingDamageReduction()

uint32 Unit::GetCombatRatingDamageReduction ( CombatRating  cr,
float  rate,
float  cap,
uint32  damage 
) const
private
19098{
19099 float percent = std::min(GetCombatRatingReduction(cr) * rate, cap);
19100 return CalculatePct(damage, percent);
19101}
float GetCombatRatingReduction(CombatRating cr) const
Definition: Unit.cpp:19085

References CalculatePct(), and GetCombatRatingReduction().

Referenced by GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritDamageReduction(), and GetSpellDamageReduction().

◆ GetCombatRatingReduction()

float Unit::GetCombatRatingReduction ( CombatRating  cr) const
private
19086{
19087 if (Player const* player = ToPlayer())
19088 return player->GetRatingBonusValue(cr);
19089 // Player's pet get resilience from owner
19090 else if (IsPet() && GetOwner())
19091 if (Player* owner = GetOwner()->ToPlayer())
19092 return owner->GetRatingBonusValue(cr);
19093
19094 return 0.0f;
19095}

References GetOwner(), IsPet(), and Object::ToPlayer().

Referenced by GetCombatRatingDamageReduction(), GetMeleeCritChanceReduction(), GetRangedCritChanceReduction(), and GetSpellCritChanceReduction().

◆ GetCombatReach()

◆ GetCombatTimer()

uint32 Unit::GetCombatTimer ( ) const
inline
1041{ return m_CombatTimer; }

References m_CombatTimer.

Referenced by Spell::DoSpellHitOnUnit(), and SetInCombatState().

◆ GetComboPoints() [1/2]

uint8 Unit::GetComboPoints ( ObjectGuid const &  guid) const
inline
1633{ return (m_comboTarget && m_comboTarget->GetGUID() == guid) ? m_comboPoints : 0; }

References Object::GetGUID(), m_comboPoints, and m_comboTarget.

◆ GetComboPoints() [2/2]

uint8 Unit::GetComboPoints ( Unit const *  who = nullptr) const
inline

--------—Combo point system----------------—

1632{ return (who && m_comboTarget != who) ? 0 : m_comboPoints; }

References m_comboPoints, and m_comboTarget.

Referenced by CalcSpellDuration(), SpellEffectInfo::CalcValue(), Spell::CheckCast(), and Spell::EffectSchoolDMG().

◆ GetComboTarget()

Unit * Unit::GetComboTarget ( ) const
inline
1634{ return m_comboTarget; }

References m_comboTarget.

Referenced by Player::DuelComplete(), and HandleProcTriggerSpell().

◆ GetComboTargetGUID()

ObjectGuid const Unit::GetComboTargetGUID ( ) const
inline

◆ GetCreateHealth()

◆ GetCreateMana()

◆ GetCreatePowers()

uint32 Unit::GetCreatePowers ( Powers  power) const
15574{
15575 // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
15576 switch (power)
15577 {
15578 case POWER_MANA:
15579 return GetCreateMana();
15580 case POWER_RAGE:
15581 return 1000;
15582 case POWER_FOCUS:
15583 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 100);
15584 case POWER_ENERGY:
15585 return 100;
15586 case POWER_HAPPINESS:
15587 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 1050000);
15588 case POWER_RUNIC_POWER:
15589 return 1000;
15590 case POWER_RUNE:
15591 return 0;
15592 case POWER_HEALTH:
15593 return 0;
15594 default:
15595 break;
15596 }
15597
15598 return 0;
15599}
@ POWER_HEALTH
Definition: SharedDefines.h:278
@ POWER_RUNIC_POWER
Definition: SharedDefines.h:275
@ POWER_ENERGY
Definition: SharedDefines.h:272
@ POWER_RUNE
Definition: SharedDefines.h:274
@ POWER_FOCUS
Definition: SharedDefines.h:271
uint32 GetCreateMana() const
Definition: Unit.h:1383

References GetCreateMana(), HUNTER_PET, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, and POWER_RUNIC_POWER.

Referenced by Pet::CreateBaseAtTamed(), HandleDummyAuraProc(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), setPowerType(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ GetCreateStat()

float Unit::GetCreateStat ( Stats  stat) const
inline

◆ GetCreatorGUID()

ObjectGuid Unit::GetCreatorGUID ( ) const
inline
@ UNIT_FIELD_CREATEDBY
Definition: UpdateFields.h:91

References Object::GetGuidValue(), and UNIT_FIELD_CREATEDBY.

Referenced by Condition::Meets().

◆ GetCreatureType()

uint32 Unit::GetCreatureType ( ) const
15096{
15097 if (IsPlayer())
15098 {
15100 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
15101 if (ssEntry && ssEntry->creatureType > 0)
15102 return ssEntry->creatureType;
15103 else
15105 }
15106 else
15107 return ToCreature()->GetCreatureTemplate()->type;
15108}
ShapeshiftForm
Definition: UnitDefines.h:68
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
@ CREATURE_TYPE_HUMANOID
Definition: SharedDefines.h:2634
uint32 type
Definition: CreatureData.h:225
ShapeshiftForm GetShapeshiftForm() const
Definition: Unit.h:1413
Definition: DBCStructure.h:1817
int32 creatureType
Definition: DBCStructure.h:1823

References CREATURE_TYPE_HUMANOID, SpellShapeshiftFormEntry::creatureType, Creature::GetCreatureTemplate(), GetShapeshiftForm(), Object::IsPlayer(), sSpellShapeshiftFormStore, Object::ToCreature(), and CreatureTemplate::type.

Referenced by Creature::CanStartAttack(), spell_utgarde_pinnacle_beast_mark::CheckProc(), Spell::EffectKnockBack(), spell_dk_death_pact::FilterTargets(), GetCreatureTypeMask(), GetUnitParryChance(), AuraEffect::HandleAuraEmpathy(), spell_dru_starfall_dummy::HandleDummy(), IsCritter(), CreatureAI::MoveInLineOfSight(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), SetInCombatState(), and Creature::UpdateMoveInLineOfSightState().

◆ GetCreatureTypeMask()

uint32 Unit::GetCreatureTypeMask ( ) const
inline
873 {
874 uint32 creatureType = GetCreatureType();
875 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
876 }
uint32 GetCreatureType() const
Definition: Unit.cpp:15095

References GetCreatureType().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), SpellInfo::CheckTargetCreatureType(), MeleeDamageBonusDone(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ GetCritterGUID()

ObjectGuid Unit::GetCritterGUID ( ) const
inline

◆ GetCurrentSpell() [1/2]

◆ GetCurrentSpell() [2/2]

Spell * Unit::GetCurrentSpell ( uint32  spellType) const
inline
1404{ return m_currentSpells[spellType]; }

References m_currentSpells.

◆ GetCurrentSpellCastTime()

int32 Unit::GetCurrentSpellCastTime ( uint32  spell_id) const
4111{
4112 if (Spell const* spell = FindCurrentSpellBySpellId(spell_id))
4113 return spell->GetCastTime();
4114 return 0;
4115}
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition: Unit.cpp:4102

References FindCurrentSpellBySpellId().

Referenced by CasterAI::JustEngagedWith(), CasterAI::UpdateAI(), and boss_mandokir::boss_mandokirAI::UpdateAI().

◆ getDeathState()

◆ GetDebugInfo()

std::string Unit::GetDebugInfo ( ) const
overridevirtual

Reimplemented from WorldObject.

21194{
21195 std::stringstream sstr;
21196 sstr << WorldObject::GetDebugInfo() << "\n"
21197 << std::boolalpha
21198 << "AliveState: " << IsAlive()
21199 << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags()
21200 << " Class: " << std::to_string(getClass());
21201 return sstr.str();
21202}
std::string GetDebugInfo() const override
Definition: Object.cpp:2481

References getClass(), WorldObject::GetDebugInfo(), GetExtraUnitMovementFlags(), GetUnitMovementFlags(), and IsAlive().

Referenced by UnitAI::GetDebugInfo(), Creature::GetDebugInfo(), and Player::GetDebugInfo().

◆ GetDefaultMovementType()

MovementGeneratorType Unit::GetDefaultMovementType ( ) const
virtual

-------—End of Pet responses methods-------—

Reimplemented in Creature.

16560{
16561 return IDLE_MOTION_TYPE;
16562}
@ IDLE_MOTION_TYPE
Definition: MotionMaster.h:37

References IDLE_MOTION_TYPE.

◆ GetDefenseSkillValue()

uint32 Unit::GetDefenseSkillValue ( Unit const *  target = nullptr) const
3586{
3587 if (IsPlayer())
3588 {
3589 // in PvP use full skill instead current skill value
3590 uint32 value = (target && target->IsPlayer())
3593 value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
3594 return value;
3595 }
3596 else
3597 return GetUnitMeleeSkill(target);
3598}
@ CR_DEFENSE_SKILL
Definition: Unit.h:218
@ SKILL_DEFENSE
Definition: SharedDefines.h:2881
uint16 GetSkillValue(uint32 skill) const
Definition: Player.cpp:5393
uint16 GetMaxSkillValue(uint32 skill) const
Definition: Player.cpp:5410

References CR_DEFENSE_SKILL, Player::GetMaxSkillValue(), Player::GetSkillValue(), GetUnitMeleeSkill(), Object::IsPlayer(), SKILL_DEFENSE, and Object::ToPlayer().

Referenced by spell_pal_ardent_defender::Absorb(), DealMeleeDamage(), GetUnitCriticalChance(), RollMeleeOutcomeAgainst(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetDiminishing()

DiminishingLevels Unit::GetDiminishing ( DiminishingGroup  group)
14921{
14922 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
14923 {
14924 if (i->DRGroup != group)
14925 continue;
14926
14927 if (!i->hitCount)
14928 return DIMINISHING_LEVEL_1;
14929
14930 if (!i->hitTime)
14931 return DIMINISHING_LEVEL_1;
14932
14933 // If last spell was casted more than 15 seconds ago - reset the count.
14934 if (i->stack == 0 && getMSTimeDiff(i->hitTime, GameTime::GetGameTimeMS().count()) > 15000)
14935 {
14936 i->hitCount = DIMINISHING_LEVEL_1;
14937 return DIMINISHING_LEVEL_1;
14938 }
14939 // or else increase the count.
14940 else
14941 return DiminishingLevels(i->hitCount);
14942 }
14943 return DIMINISHING_LEVEL_1;
14944}
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition: Timer.h:110

References DIMINISHING_LEVEL_1, GameTime::GetGameTimeMS(), getMSTimeDiff(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDirectTransport()

TransportBase * Unit::GetDirectTransport ( ) const

Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)

18671{
18672 if (Vehicle* veh = GetVehicle())
18673 return veh;
18674 return GetTransport();
18675}
Vehicle * GetVehicle() const
Definition: Unit.h:1696

References WorldObject::GetTransport(), and GetVehicle().

Referenced by Movement::TransportPathTransform::operator()(), SmartScript::ProcessAction(), CharmInfo::SaveStayPosition(), WaypointMovementGenerator< Creature >::StartMove(), and UpdateSplinePosition().

◆ GetDiseasesByCaster()

uint32 Unit::GetDiseasesByCaster ( ObjectGuid  casterGUID,
uint8  mode = 0 
)
5766{
5767 static const AuraType diseaseAuraTypes[] =
5768 {
5769 SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague
5770 SPELL_AURA_LINKED, // Crypt Fever and Ebon Plague
5772 };
5773
5774 ObjectGuid drwGUID;
5775
5776 if (Player* playerCaster = ObjectAccessor::GetPlayer(*this, casterGUID))
5777 drwGUID = playerCaster->getRuneWeaponGUID();
5778
5779 uint32 diseases = 0;
5780 for (uint8 index = 0; diseaseAuraTypes[index] != SPELL_AURA_NONE; ++index)
5781 {
5782 for (AuraEffectList::iterator i = m_modAuras[diseaseAuraTypes[index]].begin(); i != m_modAuras[diseaseAuraTypes[index]].end();)
5783 {
5784 // Get auras with disease dispel type by caster
5785 if ((*i)->GetSpellInfo()->Dispel == DISPEL_DISEASE
5786 && ((*i)->GetCasterGUID() == casterGUID || (*i)->GetCasterGUID() == drwGUID)) // if its caster or his dancing rune weapon
5787 {
5788 ++diseases;
5789
5790 if (mode == 1)
5791 {
5792 RemoveAura((*i)->GetId(), (*i)->GetCasterGUID());
5793 i = m_modAuras[diseaseAuraTypes[index]].begin();
5794 continue;
5795 }
5796 // used for glyph of scourge strike
5797 else if (mode == 2)
5798 {
5799 Aura* aura = (*i)->GetBase();
5800 if (aura && !aura->IsRemoved() && aura->GetDuration() > 0)
5801 if ((aura->GetApplyTime() + aura->GetMaxDuration() / 1000 + 8) > (GameTime::GetGameTime().count() + aura->GetDuration() / 1000))
5802 aura->SetDuration(aura->GetDuration() + 3000);
5803 }
5804 }
5805 ++i;
5806 }
5807 }
5808 return diseases;
5809}
AuraType
Definition: SpellAuraDefines.h:62
@ SPELL_AURA_LINKED
Definition: SpellAuraDefines.h:347
@ SPELL_AURA_NONE
Definition: SpellAuraDefines.h:63
@ DISPEL_DISEASE
Definition: SharedDefines.h:1375
int32 GetMaxDuration() const
Definition: SpellAuras.h:129
time_t GetApplyTime() const
Definition: SpellAuras.h:128

References DISPEL_DISEASE, Aura::GetApplyTime(), Aura::GetDuration(), GameTime::GetGameTime(), Aura::GetMaxDuration(), ObjectAccessor::GetPlayer(), Aura::IsRemoved(), m_modAuras, RemoveAura(), Aura::SetDuration(), SPELL_AURA_LINKED, SPELL_AURA_NONE, and SPELL_AURA_PERIODIC_DAMAGE.

Referenced by Spell::EffectWeaponDmg(), MeleeDamageBonusDone(), and SpellPctDamageModsDone().

◆ GetDispellableAuraList()

void Unit::GetDispellableAuraList ( Unit caster,
uint32  dispelMask,
DispelChargesList dispelList,
SpellInfo const *  dispelSpell 
)
5550{
5551 // we should not be able to dispel diseases if the target is affected by unholy blight
5552 if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
5553 dispelMask &= ~(1 << DISPEL_DISEASE);
5554
5555 ReputationRank rank = GetReactionTo(caster, IsCharmed());
5556 bool positive = rank >= REP_FRIENDLY;
5557
5558 // Neutral unit not at war with caster should be treated as a friendly unit
5559 if (rank == REP_NEUTRAL)
5560 {
5561 if (Player* casterPlayer = caster->GetAffectingPlayer())
5562 {
5563 if (FactionTemplateEntry const* factionTemplateEntry = GetFactionTemplateEntry())
5564 {
5565 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
5566 {
5567 if (factionEntry->CanBeSetAtWar())
5568 {
5569 positive = !casterPlayer->GetReputationMgr().IsAtWar(factionEntry);
5570 }
5571 }
5572 }
5573 }
5574 }
5575
5576 Unit::VisibleAuraMap const* visibleAuras = GetVisibleAuras();
5577 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
5578 {
5579 Aura* aura = itr->second->GetBase();
5580
5581 // don't try to remove passive auras
5582 if (aura->IsPassive())
5583 continue;
5584
5585 if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
5586 {
5587 if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
5588 {
5589 // do not remove positive auras if friendly target
5590 // negative auras if non-friendly target
5591 if (itr->second->IsPositive() == positive)
5592 continue;
5593 }
5594
5595 // Banish should only be dispelled by Mass Dispel
5596 if (aura->GetSpellInfo()->Mechanic == MECHANIC_BANISH && !dispelSpell->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
5597 {
5598 continue;
5599 }
5600
5601 // The charges / stack amounts don't count towards the total number of auras that can be dispelled.
5602 // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
5603 // Polymorph instead of 1 / (5 + 1) -> 16%.
5604 bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
5605 uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
5606 if (charges > 0)
5607 dispelList.push_back(std::make_pair(aura, charges));
5608 }
5609 }
5610}
@ SPELL_ATTR7_DISPEL_REMOVES_CHARGES
Definition: SharedDefines.h:651
@ MECHANIC_BANISH
Definition: SharedDefines.h:1343
@ SPELL_ATTR0_NO_IMMUNITIES
Definition: SharedDefines.h:411
@ REP_FRIENDLY
Definition: SharedDefines.h:184
@ DISPEL_MAGIC
Definition: SharedDefines.h:1373
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5642
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition: Unit.h:652
VisibleAuraMap const * GetVisibleAuras()
Definition: Unit.h:1493
uint8 GetStackAmount() const
Definition: SpellAuras.h:148
uint8 GetCharges() const
Definition: SpellAuras.h:141
bool IsPassive() const
Definition: SpellAuras.cpp:1082
uint32 Mechanic
Definition: SpellInfo.h:323
uint32 Dispel
Definition: SpellInfo.h:322

References SpellInfo::Dispel, DISPEL_DISEASE, DISPEL_MAGIC, GetAffectingPlayer(), Aura::GetCharges(), SpellInfo::GetDispelMask(), GetFactionTemplateEntry(), GetReactionTo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetVisibleAuras(), SpellInfo::HasAttribute(), HasAura(), IsCharmed(), Aura::IsPassive(), SpellInfo::Mechanic, MECHANIC_BANISH, REP_FRIENDLY, REP_NEUTRAL, sFactionStore, SPELL_ATTR0_NO_IMMUNITIES, and SPELL_ATTR7_DISPEL_REMOVES_CHARGES.

Referenced by Spell::EffectDispel().

◆ GetDisplayId()

uint32 Unit::GetDisplayId ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_DISPLAYID.

Referenced by boss_jormungarAI::AttackStart(), WorldSession::BuildPartyMemberStatsChangedPacket(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Pet::CreateBaseAtCreature(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), boss_jormungarAI::DoAction(), GetDisplayRace(), AuraEffect::HandleAuraCloneCaster(), spell_gen_model_visible::HandleEffectApply(), WorldSession::HandleMirrorImageDataRequest(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleRequestPartyMemberStatsOpcode(), spell_death_knight_initiate_visual::HandleScriptEffect(), wp_commandscript::HandleWpShowCommand(), Guardian::InitStatsForLevel(), IsInDisallowedMountForm(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), npc_scholomance_occultist::npc_scholomance_occultistAI::JustEngagedWith(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::KilledUnit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::KilledUnit(), achievement_less_rabi::OnCheck(), WretchedGhoulCleaner::operator()(), boss_leotheras_the_blind::Reset(), boss_jormungarAI::ScheduleEvents(), Creature::SetObjectScale(), boss_halion::boss_halionAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), and boss_leotheras_the_blind::UpdateAI().

◆ GetDisplayRace()

DisplayRace Unit::GetDisplayRace ( ) const
inline
DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const
Definition: Unit.cpp:20904
uint32 GetDisplayId() const
Definition: Unit.h:1510

References GetDisplayId(), and GetDisplayRaceFromModelId().

Referenced by AuraEffect::HandleAuraTransform().

◆ GetDisplayRaceFromModelId()

DisplayRace Unit::GetDisplayRaceFromModelId ( uint32  modelId) const
20905{
20906 if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId))
20907 {
20908 if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID))
20909 {
20910 return DisplayRace(displayExtra->DisplayRaceID);
20911 }
20912 }
20913 return DisplayRace::None;
20914}
DBCStorage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt)
DisplayRace
Definition: SharedDefines.h:111
Definition: DBCStructure.h:739

References sCreatureDisplayInfoExtraStore, and sCreatureDisplayInfoStore.

Referenced by GetDisplayRace().

◆ GetDoTsByCaster()

uint32 Unit::GetDoTsByCaster ( ObjectGuid  casterGUID) const
5812{
5813 static const AuraType diseaseAuraTypes[] =
5814 {
5818 };
5819
5820 uint32 dots = 0;
5821 for (AuraType const* itr = &diseaseAuraTypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
5822 {
5823 Unit::AuraEffectList const& auras = GetAuraEffectsByType(*itr);
5824 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5825 {
5826 // Get auras by caster
5827 if ((*i)->GetCasterGUID() == casterGUID)
5828 ++dots;
5829 }
5830 }
5831 return dots;
5832}
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition: SpellAuraDefines.h:152

References GetAuraEffectsByType(), SPELL_AURA_NONE, SPELL_AURA_PERIODIC_DAMAGE, and SPELL_AURA_PERIODIC_DAMAGE_PERCENT.

Referenced by SpellPctDamageModsDone().

◆ GetDummyAuraEffect()

◆ GetDynamicFlags()

◆ GetDynObject()

DynamicObject * Unit::GetDynObject ( uint32  spellId)
6073{
6074 if (m_dynObj.empty())
6075 return nullptr;
6076 for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
6077 {
6078 DynamicObject* dynObj = *i;
6079 if (dynObj->GetSpellId() == spellId)
6080 return dynObj;
6081 }
6082 return nullptr;
6083}
Definition: DynamicObject.h:35
uint32 GetSpellId() const
Definition: DynamicObject.h:58

References DynamicObject::GetSpellId(), and m_dynObj.

Referenced by Spell::DelayedChannel(), and WorldSession::HandleFarSightOpcode().

◆ GetEffectiveResistChance()

float Unit::GetEffectiveResistChance ( Unit const *  owner,
SpellSchoolMask  schoolMask,
Unit const *  victim 
)
static
2078{
2079 float victimResistance = float(victim->GetResistance(schoolMask));
2080 if (owner)
2081 {
2082 // Xinef: pets inherit 100% of masters penetration
2083 // Xinef: excluding traps
2084 Player const* player = owner->GetSpellModOwner();
2085 if (player && owner->GetEntry() != WORLD_TRIGGER)
2086 {
2087 victimResistance += float(player->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2088 victimResistance -= float(player->GetSpellPenetrationItemMod());
2089 }
2090 else
2091 victimResistance += float(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2092 }
2093
2094 victimResistance = std::max(victimResistance, 0.0f);
2095 if (owner)
2096 victimResistance += std::max((float(victim->GetLevel()) - float(owner->GetLevel())) * 5.0f, 0.0f);
2097
2098 static uint32 const BOSS_LEVEL = 83;
2099 static float const BOSS_RESISTANCE_CONSTANT = 510.0f;
2100 uint32 level = victim->GetLevel();
2101 float resistanceConstant = 0.0f;
2102
2103 if (level == BOSS_LEVEL)
2104 resistanceConstant = BOSS_RESISTANCE_CONSTANT;
2105 else
2106 resistanceConstant = level * 5.0f;
2107
2108 return victimResistance / (victimResistance + resistanceConstant);
2109}
int32 GetSpellPenetrationItemMod() const
Definition: Player.h:1948

References Object::GetEntry(), GetLevel(), GetResistance(), GetSpellModOwner(), Player::GetSpellPenetrationItemMod(), GetTotalAuraModifierByMiscMask(), SPELL_AURA_MOD_TARGET_RESISTANCE, and WORLD_TRIGGER.

Referenced by CalcAbsorbResist(), and MagicSpellHitResult().

◆ GetExtraUnitMovementFlags()

uint16 Unit::GetExtraUnitMovementFlags ( ) const
inline

◆ GetFaction()

uint32 Unit::GetFaction ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_FACTIONTEMPLATE.

Referenced by npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::AttackStart(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::AttackStart(), Creature::CanAssistTo(), spell_q10985_light_of_the_naaru::CheckProc(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), Spell::EffectDuel(), Spell::EffectSummonType(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::EnterEvadeMode(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::EnterEvadeMode(), AuctionListItemsDelayEvent::Execute(), npc_chesspiece::GetDefaultOrientationForTeam(), GetFactionTemplateEntry(), GetReactionTo(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListOwnerItemsEvent(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleGossipHelloOpcode(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandlePlayerLoginFromDB(), TempSummon::InitStats(), InitTamedPet(), IsFriendly(), IsInPartyWith(), IsInRaidWith(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_escortAI::JustRespawned(), FollowerAI::JustRespawned(), SmartAI::JustRespawned(), boss_volkhan::boss_volkhanAI::JustSummoned(), Pet::LoadPetFromDB(), npc_chesspiece::npc_chesspiece(), npc_plucky::npc_pluckyAI::npc_pluckyAI(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::npc_taskmaster_fizzuleAI(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), npc_eris_hevenfire::OnQuestAccept(), npc_cork_gizelton::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), PatchValuesUpdate(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), WorldSession::SendAuctionHello(), SetCharmedBy(), Player::SetGameMaster(), npc_chesspiece::sGossipHello(), boss_malchezaar::SpawnInfernal(), Spell::SummonGuardian(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), npc_chesspiece::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), and Creature::UpdateMoveInLineOfSightState().

◆ GetFactionReactionTo()

ReputationRank Unit::GetFactionReactionTo ( FactionTemplateEntry const *  factionTemplateEntry,
Unit const *  target 
) const
10120{
10121 // always neutral when no template entry found
10122 if (!factionTemplateEntry)
10123 return REP_NEUTRAL;
10124
10125 FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry();
10126 if (!targetFactionTemplateEntry)
10127 return REP_NEUTRAL;
10128
10129 // xinef: check forced reputation for self also
10130 if (Player const* selfPlayerOwner = GetAffectingPlayer())
10131 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(target->GetFactionTemplateEntry()))
10132 return *repRank;
10133
10134 if (Player const* targetPlayerOwner = target->GetAffectingPlayer())
10135 {
10136 // check contested flags
10137 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10138 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10139 return REP_HOSTILE;
10140 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))
10141 return *repRank;
10142 if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10143 {
10144 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
10145 {
10146 if (factionEntry->CanHaveReputation())
10147 {
10148 // CvP case - check reputation, don't allow state higher than neutral when at war
10149 ReputationRank repRank = targetPlayerOwner->GetReputationMgr().GetRank(factionEntry);
10150 if (targetPlayerOwner->GetReputationMgr().IsAtWar(factionEntry))
10151 repRank = std::min(REP_NEUTRAL, repRank);
10152 return repRank;
10153 }
10154 }
10155 }
10156 }
10157
10158 // common faction based check
10159 if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
10160 return REP_HOSTILE;
10161 if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
10162 return REP_FRIENDLY;
10163 if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
10164 return REP_FRIENDLY;
10165 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS)
10166 return REP_HOSTILE;
10167 // neutral by default
10168 return REP_NEUTRAL;
10169}
@ UNIT_FLAG2_IGNORE_REPUTATION
Definition: UnitDefines.h:270
@ PLAYER_FLAGS_CONTESTED_PVP
Definition: Player.h:482
@ FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS
Definition: DBCEnums.h:332
@ FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
Definition: DBCEnums.h:331
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition: DBCStructure.h:951

References FactionTemplateEntry::faction, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS, FactionTemplateEntry::factionFlags, GetAffectingPlayer(), GetFactionTemplateEntry(), HasUnitFlag2(), FactionTemplateEntry::IsFriendlyTo(), FactionTemplateEntry::IsHostileTo(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HOSTILE, REP_NEUTRAL, sFactionStore, and UNIT_FLAG2_IGNORE_REPUTATION.

Referenced by GetReactionTo().

◆ GetFactionTemplateEntry()

FactionTemplateEntry const * Unit::GetFactionTemplateEntry ( ) const
9970{
9971 FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(GetFaction());
9972 if (!entry)
9973 {
9974 static ObjectGuid guid; // prevent repeating spam same faction problem
9975
9976 if (GetGUID() != guid)
9977 {
9978 if (Player const* player = ToPlayer())
9979 LOG_ERROR("entities.unit", "Player {} has invalid faction (faction template id) #{}", player->GetName(), GetFaction());
9980 else if (Creature const* creature = ToCreature())
9981 LOG_ERROR("entities.unit", "Creature (template id: {}) has invalid faction (faction template id) #{}", creature->GetCreatureTemplate()->Entry, GetFaction());
9982 else
9983 LOG_ERROR("entities.unit", "Unit (name={}, type={}) has invalid faction (faction template id) #{}", GetName(), uint32(GetTypeId()), GetFaction());
9984
9985 guid = GetGUID();
9986 }
9987 }
9988 return entry;
9989}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
std::string const & GetName() const
Definition: Object.h:456
uint32 GetFaction() const
Definition: Unit.h:839

References GetFaction(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), LOG_ERROR, sFactionTemplateStore, Object::ToCreature(), and Object::ToPlayer().

Referenced by _IsValidAttackTarget(), Player::CanUseBattlegroundObject(), HostileRefMgr::deleteReferencesForFaction(), Spell::EffectGameObjectDamage(), GetDispellableAuraList(), GetFactionReactionTo(), GetReactionTo(), Player::GetReputationPriceDiscount(), IsContestedGuard(), IsHostileToPlayers(), IsNeutralToAll(), npc_chesspiece::OnCharmed(), and PatchValuesUpdate().

◆ GetFirstControlled()

Unit * Unit::GetFirstControlled ( ) const
10997{
10998 // Sequence: charmed, pet, other guardians
10999 Unit* unit = GetCharm();
11000 if (!unit)
11001 if (ObjectGuid guid = GetMinionGUID())
11002 unit = ObjectAccessor::GetUnit(*this, guid);
11003
11004 return unit;
11005}
ObjectGuid GetMinionGUID() const
Definition: Unit.h:1160

References GetCharm(), GetMinionGUID(), and ObjectAccessor::GetUnit().

Referenced by Player::CharmSpellInitialize(), CombatStart(), WorldSession::HandlePetSetAction(), and RemoveCharmedBy().

◆ GetFirstMinion()

Minion * Unit::GetFirstMinion ( ) const
10563{
10564 if (ObjectGuid pet_guid = GetMinionGUID())
10565 {
10566 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10567 if (pet->HasUnitTypeMask(UNIT_MASK_MINION))
10568 return (Minion*)pet;
10569
10570 LOG_ERROR("entities.unit", "Unit::GetFirstMinion: Minion {} not exist.", pet_guid.ToString());
10571 const_cast<Unit*>(this)->SetMinionGUID(ObjectGuid::Empty);
10572 }
10573
10574 return nullptr;
10575}
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition: ObjectAccessor.cpp:237
void SetMinionGUID(ObjectGuid guid)
Definition: Unit.h:1161

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetMinionGUID(), LOG_ERROR, SetMinionGUID(), and UNIT_MASK_MINION.

◆ GetFollowAngle()

◆ GetGameObject()

GameObject * Unit::GetGameObject ( uint32  spellId) const
6114{
6115 for (GameObjectList::const_iterator itr = m_gameObj.begin(); itr != m_gameObj.end(); ++itr)
6116 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6117 if (go->GetSpellId() == spellId)
6118 return go;
6119
6120 return nullptr;
6121}

References ObjectAccessor::GetGameObject(), and m_gameObj.

Referenced by Player::GetGameObjectIfCanInteractWith(), and Player::TeleportTo().

◆ getGender()

◆ GetGuardianPet()

Guardian * Unit::GetGuardianPet ( ) const
10578{
10579 if (ObjectGuid pet_guid = GetPetGUID())
10580 {
10581 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10582 if (pet->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10583 return (Guardian*)pet;
10584
10585 LOG_FATAL("entities.unit", "Unit::GetGuardianPet: Guardian {} not exist.", pet_guid.ToString());
10586 const_cast<Unit*>(this)->SetPetGUID(ObjectGuid::Empty);
10587 }
10588
10589 return nullptr;
10590}
#define LOG_FATAL(filterType__,...)
Definition: Log.h:152
Definition: TemporarySummon.h:95
void SetPetGUID(ObjectGuid guid)
Definition: Unit.h:1165
ObjectGuid GetPetGUID() const
Definition: Unit.h:1166

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetPetGUID(), LOG_FATAL, SetPetGUID(), and UNIT_MASK_GUARDIAN.

Referenced by spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Spell::EffectSummonPet(), GetNextRandomRaidMemberOrPet(), AuraEffect::HandleAuraDummy(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), AuraEffect::HandleModDamageDone(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), Spell::SelectImplicitCasterObjectTargets(), and SetMinion().

◆ GetHealth()

uint32 Unit::GetHealth ( ) const
inline
@ UNIT_FIELD_HEALTH
Definition: UpdateFields.h:96

References Object::GetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_SaveCharacter(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), Spell::CheckPower(), CountPctFromCurHealth(), boss_eregos::boss_eregosAI::DamageTaken(), boss_gyth::boss_gythAI::DamageTaken(), boss_razorgore::boss_razorgoreAI::DamageTaken(), boss_majordomo::boss_majordomoAI::DamageTaken(), boss_ragnaros::boss_ragnarosAI::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_julianne::DamageTaken(), boss_romulo::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::DamageTaken(), boss_halazzi::DamageTaken(), npc_halazzi_lynx::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), npc_amanitar_mushrooms::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_announcer_toc5::npc_announcer_toc5AI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_ick::boss_ickAI::DamageTaken(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::DamageTaken(), boss_drakkari_colossus::boss_drakkari_colossusAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_illidan_stormrage::boss_illidan_stormrageAI::DamageTaken(), npc_akama_illidan::npc_akama_illidanAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), boss_the_lurker_below::DamageTaken(), npc_shattered_hand_scout::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_hor_leader_second::npc_hor_leader_secondAI::DamageTaken(), npc_ice_tomb::npc_ice_tombAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_nightbane::DamageTaken(), boss_thekal::DamageTaken(), npc_garr_firesworn::npc_garr_fireswornAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_kalecgos::boss_kalecgosAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), SmartAI::DamageTaken(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), boss_sathrovarr::boss_sathrovarrAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kologarn::boss_kologarnAI::DamageTaken(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), DealMeleeDamage(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), Spell::EffectHealMaxHealth(), Spell::EffectInstaKill(), Pet::FillPetInfo(), boss_supremus::FindHatefulStrikeTarget(), GetHealthGain(), GetHealthPct(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_rajaxx_thundercrash::HandleDamageCalc(), misc_commandscript::HandleDieCommand(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), npc_commandscript::HandleNpcInfoCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), IsFullHealth(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustDied(), npc_dirt_mound::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), Kill(), ModifyHealth(), spell_xt002_gravity_bomb_aura::OnPeriodic(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::ResetPlayerDamageReq(), Player::SaveHealthBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), SendAttackStateUpdate(), SendSpellNonMeleeDamageLog(), SendSpellNonMeleeReflectLog(), SetMaxHealth(), boss_eadric::boss_eadricAI::SpellHit(), boss_headless_horseman_head::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), boss_ouro::Submerge(), Aura::Update(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), Player::UpdateCharmedAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ GetHealthGain()

int32 Unit::GetHealthGain ( int32  dVal)
14039{
14040 int32 gain = 0;
14041
14042 if (dVal == 0)
14043 return 0;
14044
14045 int32 curHealth = (int32)GetHealth();
14046
14047 int32 val = dVal + curHealth;
14048 if (val <= 0)
14049 {
14050 return -curHealth;
14051 }
14052
14053 int32 maxHealth = (int32)GetMaxHealth();
14054
14055 if (val < maxHealth)
14056 gain = dVal;
14057 else if (curHealth != maxHealth)
14058 gain = maxHealth - curHealth;
14059
14060 return gain;
14061}

References GetHealth(), and GetMaxHealth().

Referenced by Spell::DoAllEffectOnTarget().

◆ GetHealthPct()

◆ getHostileRefMgr()

◆ GetHoverHeight()

float Unit::GetHoverHeight ( ) const
inline

◆ GetInterruptMask()

uint32 Unit::GetInterruptMask ( ) const
inline
1504{ return m_interruptMask; }

References m_interruptMask.

◆ GetLastDamagedTargetGuid()

ObjectGuid const & Unit::GetLastDamagedTargetGuid ( ) const
inline
917{ return _lastDamagedTargetGuid; }

References _lastDamagedTargetGuid.

◆ GetLastExtraAttackSpell()

uint32 Unit::GetLastExtraAttackSpell ( ) const
inline
914{ return _lastExtraAttackSpell; }

References _lastExtraAttackSpell.

Referenced by HandleProcTriggerSpell().

◆ GetLevel()

uint8 Unit::GetLevel ( ) const
inline
@ UNIT_FIELD_LEVEL
Definition: UpdateFields.h:114

References Object::GetUInt32Value(), and UNIT_FIELD_LEVEL.

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDamage(), KillRewarder::_InitGroupData(), Pet::_LoadAuras(), KillRewarder::_RewardPlayer(), KillRewarder::_RewardXP(), Player::_SaveCharacter(), Player::_SaveStats(), spell_pal_ardent_defender::Absorb(), Pet::addSpell(), Spell::AddUnitTarget(), Player::ApplyEnchantment(), AuraEffect::AuraEffect(), BattlegroundMgr::BuildBattlegroundListPacket(), WorldSession::BuildPartyMemberStatsChangedPacket(), CalcArmorReducedDamage(), SpellInfo::CalcPowerCost(), SpellEffectInfo::CalcRadius(), spell_gen_disabled_above_63::CalculateAmount(), spell_item_arcane_shroud::CalculateAmount(), spell_item_the_eye_of_diminution::CalculateAmount(), CalculateLevelPenalty(), CalculateMeleeDamage(), Player::CalculateMinMaxDamage(), Player::CalculateQuestRewardXP(), Player::CalculateReputationGain(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Player::CanEquipItem(), Group::CanJoinBattlegroundQueue(), Player::CanSeeStartQuest(), Player::CanUseItem(), Player::CheckAreaExploreAndOutdoor(), spell_hun_tame_beast::CheckCast(), Spell::CheckCast(), Spell::CheckEffectTarget(), spell_gen_proc_above_75::CheckLevel(), spell_gen_proc_reduced_above_60::CheckProc(), spell_item_green_whelp_armor::CheckProc(), Pet::CreateBaseAtTamed(), Player::CreatePet(), CreateTamedPetFrom(), DealMeleeDamage(), DoLowUnlearnCost(), DoMedUnlearnCost(), Spell::DoSpellHitOnUnit(), Spell::EffectAddHonor(), Spell::EffectApplyGlyph(), Spell::EffectDuel(), Spell::EffectEnergize(), Spell::EffectSchoolDMG(), Spell::EffectSkinning(), Spell::EffectTameCreature(), Pet::FillPetInfo(), lfg::LFGMgr::FinishDungeon(), Acore::XP::Gain(), Player::GetAverageItemLevel(), Player::GetAverageItemLevelForDF(), Player::GetBarberShopCost(), Player::GetBGAccessByLevel(), Pet::GetCurrentFoodBenefitLevel(), npc_wg_quest_giver::GetDialogStatus(), Player::GetDodgeFromAgility(), GetEffectiveResistChance(), SocialMgr::GetFriendInfo(), getLevelForTarget(), Creature::getLevelForTarget(), GetMaxSkillValueForLevel(), Player::GetMeleeCritFromAgility(), Pet::GetNativeObjectScale(), Player::GetQuestDialogStatus(), Player::GetQuestLevel(), Player::GetRatingMultiplier(), Creature::GetShieldBlockValue(), Player::GetSpellCritFromIntellect(), Player::GetsRecruitAFriendBonus(), Player::GetTrainerSpellState(), GetUnitMeleeSkill(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), WorldSession::HandleAcceptGrantLevel(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleCastSpellOpcode(), Player::HandleDrowning(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), WorldSession::HandleMessagechatOpcode(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleOfferPetitionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionSignOpcode(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), spell_pri_divine_aegis::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), reset_commandscript::HandleResetLevelCommand(), spell_wintergrasp_portal::HandleScript(), spell_item_scroll_of_recall::HandleScript(), WorldSession::HandleSendMail(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), Player::InitGlyphsForLevel(), lfg::LFGMgr::InitializeLockedDungeons(), Pet::InitLevelupSpellsForLevel(), Puppet::InitStats(), TempSummon::InitStats(), Player::InitStatsForLevel(), Pet::InitTalentForLevel(), Player::InitTaxiNodesForLevel(), Battlefield::InvitePlayerToWar(), Creature::isCanTrainingAndResetTalentsOf(), Player::isHonorOrXPTarget(), Player::IsMaxLevel(), Player::LearnDefaultSkill(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), AchievementCriteriaData::Meets(), MeleeSpellHitResult(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), spell_item_with_mount_speed::OnApply(), item_generic_limit_chance_above_60::OnCastItemCombatSpell(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), Player::OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), Player::PrepareGossipMenu(), Player::Regenerate(), Player::RegenerateHealth(), Player::RemovedInsignia(), Pet::removeSpell(), Pet::resetTalents(), Player::ResurrectPlayer(), Player::RewardHonor(), Player::RewardQuest(), RewardRage(), Player::RewardReputation(), RollMeleeOutcomeAgainst(), ArenaTeam::Roster(), Player::Satisfy(), Player::SatisfyQuestLevel(), Pet::SavePetToDB(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), WorldSession::SendLfgPlayerReward(), WorldSession::SendLfgRoleCheckUpdate(), Player::SendLoot(), PlayerMenu::SendQuestGiverOfferReward(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestQueryResponse(), Player::SendQuestReward(), ObjectMgr::SendServerMail(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), Player::SetRestBonus(), Guild::Member::SetStats(), SpellPctDamageModsDone(), Spell::SummonGuardian(), Player::SummonPet(), Pet::SynchronizeLevelWithOwner(), Aura::Update(), npc_pet_hunter_snake_trap::UpdateAI(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCombatSkills(), Creature::UpdateEntry(), lfg::LFGMgr::UpdateRaidBrowser(), and GameObject::Use().

◆ getLevelForTarget()

◆ GetMagicHitRedirectTarget()

Unit * Unit::GetMagicHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo 
)
10941{
10942 // Patch 1.2 notes: Spell Reflection no longer reflects abilities
10943 if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_NO_REDIRECTION) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
10944 return victim;
10945
10947 for (Unit::AuraEffectList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr)
10948 {
10949 if (Unit* magnet = (*itr)->GetBase()->GetUnitOwner())
10950 if (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
10951 //&& spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK
10952 && _IsValidAttackTarget(magnet, spellInfo)
10953 /*&& IsWithinLOSInMap(magnet)*/)
10954 {
10955 // Xinef: We should choose minimum between flight time and queue time as in reflect, however we dont know flight time at this point, use arbitrary small number
10956 magnet->m_Events.AddEvent(new RedirectSpellEvent(*magnet, victim->GetGUID(), *itr), magnet->m_Events.CalculateQueueTime(100));
10957
10958 if (magnet->IsTotem())
10959 {
10960 uint64 queueTime = magnet->m_Events.CalculateQueueTime(100);
10961 if (spellInfo->Speed > 0.0f)
10962 {
10963 float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ());
10964 if (dist < 5.0f)
10965 dist = 5.0f;
10966 queueTime = magnet->m_Events.CalculateTime((uint64)floor(dist / spellInfo->Speed * 1000.0f));
10967 }
10968
10969 magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime);
10970 }
10971
10972 return magnet;
10973 }
10974 }
10975 return victim;
10976}
@ SPELL_AURA_SPELL_MAGNET
Definition: SpellAuraDefines.h:159
@ SPELL_ATTR1_NO_REDIRECTION
Definition: SharedDefines.h:422
@ SPELL_ATTR0_IS_ABILITY
Definition: SharedDefines.h:386
Definition: TotemAI.h:48
float GetDistance(WorldObject const *obj) const
Definition: Object.cpp:1245
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
Definition: Unit.cpp:13792
Definition: Unit.h:2006

References _IsValidAttackTarget(), SpellInfo::CheckExplicitTarget(), GetAuraEffectsByType(), WorldObject::GetDistance(), Object::GetGUID(), SpellInfo::HasAttribute(), SpellInfo::Speed, SPELL_ATTR0_IS_ABILITY, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_NO_REDIRECTION, SPELL_AURA_SPELL_MAGNET, and SPELL_CAST_OK.

Referenced by Spell::SelectExplicitTargets().

◆ GetMaxHealth()

uint32 Unit::GetMaxHealth ( ) const
inline
@ UNIT_FIELD_MAXHEALTH
Definition: UpdateFields.h:104

References Object::GetUInt32Value(), and UNIT_FIELD_MAXHEALTH.

Referenced by Player::_SaveStats(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_viscidus::boss_viscidus(), WorldSession::BuildPartyMemberStatsChangedPacket(), spell_item_skull_of_impeding_doom::CalculateDamageAmount(), CountPctFromMaxHealth(), boss_eregos::boss_eregosAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_twinemperorsAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_heated_battle::npc_heated_battleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectHealMaxHealth(), Spell::EffectSummonPet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), Acore::XP::Gain(), GetHealthGain(), GetHealthPct(), npc_echo_of_medivh::GetPiece(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), HandleAuraProc(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcInfoCommand(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_stinky_precious_decimate::HandleScript(), IsFullHealth(), boss_twin_valkyrAI::JustEngagedWith(), boss_sister_svalna::boss_sister_svalnaAI::JustEngagedWith(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Player::outDebugValues(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), boss_kalecgos::boss_kalecgosAI::Reset(), boss_halazzi::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetFullHealth(), SetHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_viscidus::SummonedCreatureDies(), boss_headless_horseman::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxNegativeAuraModifier()

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auratype) const
5894{
5895 int32 modifier = 0;
5896
5897 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5898 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5899 if ((*i)->GetAmount() < modifier)
5900 modifier = (*i)->GetAmount();
5901
5902 return modifier;
5903}

References GetAuraEffectsByType().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxNegativeAuraModifierByAffectMask()

int32 Unit::GetMaxNegativeAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6049{
6050 int32 modifier = 0;
6051
6052 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6053 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6054 {
6055 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() < modifier)
6056 modifier = (*i)->GetAmount();
6057 }
6058
6059 return modifier;
6060}

References GetAuraEffectsByType().

◆ GetMaxNegativeAuraModifierByMiscMask()

int32 Unit::GetMaxNegativeAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
5945{
5946 int32 modifier = 0;
5947
5948 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5949 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5950 {
5951 if ((*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() < modifier)
5952 modifier = (*i)->GetAmount();
5953 }
5954
5955 return modifier;
5956}

References GetAuraEffectsByType().

Referenced by SpellTakenCritChance().

◆ GetMaxNegativeAuraModifierByMiscValue()

int32 Unit::GetMaxNegativeAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
5997{
5998 int32 modifier = 0;
5999
6000 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6001 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6002 {
6003 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() < modifier)
6004 modifier = (*i)->GetAmount();
6005 }
6006
6007 return modifier;
6008}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult(), and ModSpellDuration().

◆ GetMaxPositiveAuraModifier()

int32 Unit::GetMaxPositiveAuraModifier ( AuraType  auratype)
5880{
5881 int32 modifier = 0;
5882
5883 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5884 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5885 {
5886 if ((*i)->GetAmount() > modifier)
5887 modifier = (*i)->GetAmount();
5888 }
5889
5890 return modifier;
5891}

References GetAuraEffectsByType().

Referenced by CalculateSpellAmount(), AuraEffect::HandlePeriodicHealAurasTick(), Player::RewardHonor(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxPositiveAuraModifierByAffectMask()

int32 Unit::GetMaxPositiveAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6035{
6036 int32 modifier = 0;
6037
6038 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6039 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6040 {
6041 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() > modifier)
6042 modifier = (*i)->GetAmount();
6043 }
6044
6045 return modifier;
6046}

References GetAuraEffectsByType().

◆ GetMaxPositiveAuraModifierByMiscMask()

int32 Unit::GetMaxPositiveAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask,
const AuraEffect except = nullptr 
) const
5931{
5932 int32 modifier = 0;
5933
5934 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5935 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5936 {
5937 if (except != (*i) && (*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() > modifier)
5938 modifier = (*i)->GetAmount();
5939 }
5940
5941 return modifier;
5942}

References GetAuraEffectsByType(), and AuraEffect::GetMiscValue().

Referenced by AuraEffect::HandleAuraModResistanceExclusive(), and SpellTakenCritChance().

◆ GetMaxPositiveAuraModifierByMiscValue()

int32 Unit::GetMaxPositiveAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
5983{
5984 int32 modifier = 0;
5985
5986 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5987 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5988 {
5989 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() > modifier)
5990 modifier = (*i)->GetAmount();
5991 }
5992
5993 return modifier;
5994}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult().

◆ GetMaxPower()

uint32 Unit::GetMaxPower ( Powers  power) const
inline
804{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power); }
@ UNIT_FIELD_MAXPOWER1
Definition: UpdateFields.h:105

References Object::GetUInt32Value(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::_SaveStats(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_gen_replenishment_aura::CalculateAmount(), spell_item_skull_of_impeding_doom::CalculateManaLeechAmount(), Spell::CheckItems(), Player::Create(), boss_shade_of_aran::DamageTaken(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerBurn(), Spell::EffectResurrect(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), GetPowerPct(), Player::GiveLevel(), HandleAuraProc(), Aura::HandleAuraSpecificMods(), HandleDummyAuraProc(), modify_commandscript::HandleModifyEnergyCommand(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_hun_ascpect_of_the_viper::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_kelthuzad_detonate_mana_aura::HandleScript(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), boss_curator::JustEngagedWith(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), ModifyPowerPct(), boss_shade_of_aran::OnPowerUpdate(), Acore::PowerPctOrderPred::operator()(), Player::outDebugValues(), spell_item_oracle_ablutions::PrepareSpellScript(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), spell_bronjahm_magic_bane::RecalculateDamage(), Creature::Regenerate(), Player::Regenerate(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetPower(), setPowerType(), Player::SummonPet(), boss_selin_fireheart::UpdateAI(), boss_moam::UpdateAI(), boss_faction_championsAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), Player::UpdateCharmedAI(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxSkillValueForLevel()

uint16 Unit::GetMaxSkillValueForLevel ( Unit const *  target = nullptr) const
inline
891{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }
uint8 getLevelForTarget(WorldObject const *) const override
Definition: Unit.h:759

References GetLevel(), and getLevelForTarget().

Referenced by Player::GetMaxSkillValueForLevel(), GetUnitCriticalChance(), GetWeaponSkillValue(), isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), and SpellTakenCritChance().

◆ GetMechanicResistChance()

int32 Unit::GetMechanicResistChance ( SpellInfo const *  spell)
3094{
3095 if (!spell)
3096 return 0;
3097 int32 resist_mech = 0;
3098 for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff)
3099 {
3100 if (!spell->Effects[eff].IsEffect())
3101 break;
3102 int32 effect_mech = spell->GetEffectMechanic(eff);
3103 if (effect_mech)
3104 {
3106 if (resist_mech < temp)
3107 resist_mech = temp;
3108 }
3109 }
3110 return resist_mech;
3111}
@ SPELL_AURA_MOD_MECHANIC_RESISTANCE
Definition: SpellAuraDefines.h:180
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5958

References SpellInfo::Effects, SpellInfo::GetEffectMechanic(), GetTotalAuraModifierByMiscValue(), MAX_SPELL_EFFECTS, and SPELL_AURA_MOD_MECHANIC_RESISTANCE.

Referenced by MagicSpellHitResult(), and MeleeSpellHitResult().

◆ GetMeleeAttackPoint()

bool Unit::GetMeleeAttackPoint ( Unit attacker,
Position pos 
)
2632{
2633 if (!attacker)
2634 {
2635 return false;
2636 }
2637
2638 AttackerSet attackers = getAttackers();
2639
2640 if (attackers.size() <= 1) // if the attackers are not more than one
2641 {
2642 return false;
2643 }
2644
2645 float meleeReach = GetExactDist2d(attacker);
2646 if (meleeReach <= 0)
2647 {
2648 return false;
2649 }
2650
2651 float minAngle = 0;
2652 Unit *refUnit = nullptr;
2653 uint32 validAttackers = 0;
2654
2655 double attackerSize = attacker->GetCollisionRadius();
2656
2657 for (const auto& otherAttacker: attackers)
2658 {
2659 // if the otherAttacker is not valid, skip
2660 if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() ||
2661 !otherAttacker->IsWithinMeleeRange(this) || otherAttacker->isMoving())
2662 {
2663 continue;
2664 }
2665
2666 float curretAngle = atan(attacker->GetExactDist2d(otherAttacker) / meleeReach);
2667 if (minAngle == 0 || curretAngle < minAngle)
2668 {
2669 minAngle = curretAngle;
2670 refUnit = otherAttacker;
2671 }
2672
2673 validAttackers++;
2674 }
2675
2676 if (!validAttackers || !refUnit)
2677 {
2678 return false;
2679 }
2680
2681 float contactDist = attackerSize + refUnit->GetCollisionRadius();
2682 float requiredAngle = atan(contactDist / meleeReach);
2683 float attackersAngle = atan(attacker->GetExactDist2d(refUnit) / meleeReach);
2684
2685 // in instance: the more attacker there are, the higher will be the tollerance
2686 // outside: creatures should not intersecate
2687 float angleTollerance = attacker->GetMap()->IsDungeon() ? requiredAngle - requiredAngle * tanh(validAttackers / 5.0f) : requiredAngle;
2688
2689 if (attackersAngle > angleTollerance)
2690 {
2691 return false;
2692 }
2693
2694 double angle = atan(contactDist / meleeReach);
2695
2696 float angularRadius = frand(0.1f, 0.3f) + angle;
2697 int8 direction = (urand(0, 1) ? -1 : 1);
2698 float currentAngle = GetAngle(refUnit);
2699 float absAngle = currentAngle + angularRadius * direction;
2700
2701 float x, y, z;
2702 float distance = meleeReach - GetObjectSize();
2703 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle);
2704
2705 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2706 {
2707 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle * -1); // try the other side
2708
2709 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2710 {
2711 return false;
2712 }
2713 }
2714
2715 pos.Relocate(x, y, z);
2716
2717 return true;
2718}
float frand(float min, float max)
Definition: Random.cpp:57
std::int8_t int8
Definition: Define.h:105
void GetNearPoint(WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
Definition: Object.cpp:2623
float GetExactDist2d(const float x, const float y) const
Definition: Position.h:166
float GetCollisionRadius() const override
this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by t...
Definition: Unit.cpp:20979
std::unordered_set< Unit * > AttackerSet
Definition: Unit.h:632
AttackerSet const & getAttackers() const
Definition: Unit.h:723
bool IsDungeon() const
Definition: Map.h:448

References frand(), Position::GetAngle(), getAttackers(), GetCollisionRadius(), Position::GetExactDist2d(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetNearPoint(), WorldObject::GetObjectSize(), Map::IsDungeon(), Position::Relocate(), and urand().

Referenced by MotionMaster::MoveCircleTarget().

◆ GetMeleeCritChanceReduction()

float Unit::GetMeleeCritChanceReduction ( ) const
inline

◆ GetMeleeCritDamageReduction()

uint32 Unit::GetMeleeCritDamageReduction ( uint32  damage) const
inline
928{ return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const
Definition: Unit.cpp:19097

References CR_CRIT_TAKEN_MELEE, and GetCombatRatingDamageReduction().

Referenced by ApplyResilience(), and processDummyAuras().

◆ GetMeleeDamageReduction()

uint32 Unit::GetMeleeDamageReduction ( uint32  damage) const
inline

◆ GetMeleeDamageSchoolMask()

virtual SpellSchoolMask Unit::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
pure virtual

Implemented in Player, and Creature.

Referenced by CalculateMeleeDamage().

◆ GetMeleeHitRedirectTarget()

Unit * Unit::GetMeleeHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo = nullptr 
)
10979{
10981 for (AuraEffectList::const_iterator i = hitTriggerAuras.begin(); i != hitTriggerAuras.end(); ++i)
10982 {
10983 if (Unit* magnet = (*i)->GetBase()->GetCaster())
10984 if (_IsValidAttackTarget(magnet, spellInfo) && magnet->IsWithinLOSInMap(this)
10985 && (!spellInfo || (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
10986 && spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK)))
10987 if (roll_chance_i((*i)->GetAmount()))
10988 {
10989 (*i)->GetBase()->DropCharge(AURA_REMOVE_BY_EXPIRE);
10990 return magnet;
10991 }
10992 }
10993 return victim;
10994}
bool roll_chance_i(int chance)
Definition: Random.h:59
@ SPELL_AURA_ADD_CASTER_HIT_TRIGGER
Definition: SpellAuraDefines.h:174

References _IsValidAttackTarget(), AURA_REMOVE_BY_EXPIRE, SpellInfo::CheckExplicitTarget(), SpellInfo::CheckTarget(), GetAuraEffectsByType(), roll_chance_i(), SPELL_AURA_ADD_CASTER_HIT_TRIGGER, and SPELL_CAST_OK.

Referenced by AttackerStateUpdate(), spell_dk_dancing_rune_weapon::HandleProc(), and Spell::SelectExplicitTargets().

◆ GetMeleeRange()

float Unit::GetMeleeRange ( Unit const *  target) const
681{
682 float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
683 return std::max(range, NOMINAL_MELEE_RANGE);
684}
#define NOMINAL_MELEE_RANGE
Definition: ObjectDefines.h:48
float GetCombatReach() const override
Definition: Unit.h:687

References GetCombatReach(), and NOMINAL_MELEE_RANGE.

Referenced by GetRandomContactPoint(), IsWithinMeleeRange(), CreatureAI::MoveBackwardsChecks(), and SmartScript::ProcessAction().

◆ GetMeleeReach()

float Unit::GetMeleeReach ( ) const
inline
688{ float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
#define MIN_MELEE_REACH
Definition: ObjectDefines.h:47

References Object::m_floatValues, MIN_MELEE_REACH, and UNIT_FIELD_COMBATREACH.

Referenced by boss_veknilash::JustEngagedWith(), and npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI().

◆ GetMinionGUID()

ObjectGuid Unit::GetMinionGUID ( ) const
inline
@ UNIT_FIELD_SUMMON
Definition: UpdateFields.h:87

References Object::GetGuidValue(), and UNIT_FIELD_SUMMON.

Referenced by GetFirstControlled(), GetFirstMinion(), and OutDebugInfo().

◆ GetModelForForm()

uint32 Unit::GetModelForForm ( ShapeshiftForm  form,
uint32  spellId 
) const
19104{
19105 // Hardcoded cases
19106 switch (spellId)
19107 {
19108 case 7090: // Bear form
19109 return 29414;
19110 case 35200: // Roc form
19111 return 4877;
19112 default:
19113 break;
19114 }
19115
19116 if (IsPlayer())
19117 {
19118 switch (form)
19119 {
19120 case FORM_CAT:
19121 // Based on Hair color
19122 if (getRace() == RACE_NIGHTELF)
19123 {
19124 uint8 hairColor = GetByteValue(PLAYER_BYTES, 3);
19125 switch (hairColor)
19126 {
19127 case 7: // Violet
19128 case 8:
19129 return 29405;
19130 case 3: // Light Blue
19131 return 29406;
19132 case 0: // Green
19133 case 1: // Light Green
19134 case 2: // Dark Green
19135 return 29407;
19136 case 4: // White
19137 return 29408;
19138 default: // original - Dark Blue
19139 return 892;
19140 }
19141 }
19142 // Based on Skin color
19143 else if (getRace() == RACE_TAUREN)
19144 {
19145 uint8 skinColor = GetByteValue(PLAYER_BYTES, 0);
19146 // Male
19147 if (getGender() == GENDER_MALE)
19148 {
19149 switch (skinColor)
19150 {
19151 case 12: // White
19152 case 13:
19153 case 14:
19154 case 18: // Completly White
19155 return 29409;
19156 case 9: // Light Brown
19157 case 10:
19158 case 11:
19159 return 29410;
19160 case 6: // Brown
19161 case 7:
19162 case 8:
19163 return 29411;
19164 case 0: // Dark
19165 case 1:
19166 case 2:
19167 case 3: // Dark Grey
19168 case 4:
19169 case 5:
19170 return 29412;
19171 default: // original - Grey
19172 return 8571;
19173 }
19174 }
19175 // Female
19176 else switch (skinColor)
19177 {
19178 case 10: // White
19179 return 29409;
19180 case 6: // Light Brown
19181 case 7:
19182 return 29410;
19183 case 4: // Brown
19184 case 5:
19185 return 29411;
19186 case 0: // Dark
19187 case 1:
19188 case 2:
19189 case 3:
19190 return 29412;
19191 default: // original - Grey
19192 return 8571;
19193 }
19194 }
19196 return 892;
19197 else
19198 return 8571;
19199 case FORM_DIREBEAR:
19200 case FORM_BEAR:
19201 // Based on Hair color
19202 if (getRace() == RACE_NIGHTELF)
19203 {
19204 uint8 hairColor = GetByteValue(PLAYER_BYTES, 3);
19205 switch (hairColor)
19206 {
19207 case 0: // Green
19208 case 1: // Light Green
19209 case 2: // Dark Green
19210 return 29413; // 29415?
19211 case 6: // Dark Blue
19212 return 29414;
19213 case 4: // White
19214 return 29416;
19215 case 3: // Light Blue
19216 return 29417;
19217 default: // original - Violet
19218 return 2281;
19219 }
19220 }
19221 // Based on Skin color
19222 else if (getRace() == RACE_TAUREN)
19223 {
19224 uint8 skinColor = GetByteValue(PLAYER_BYTES, 0);
19225 // Male
19226 if (getGender() == GENDER_MALE)
19227 {
19228 switch (skinColor)
19229 {
19230 case 0: // Dark (Black)
19231 case 1:
19232 case 2:
19233 return 29418;
19234 case 3: // White
19235 case 4:
19236 case 5:
19237 case 12:
19238 case 13:
19239 case 14:
19240 return 29419;
19241 case 9: // Light Brown/Grey
19242 case 10:
19243 case 11:
19244 case 15:
19245 case 16:
19246 case 17:
19247 return 29420;
19248 case 18: // Completly White
19249 return 29421;
19250 default: // original - Brown
19251 return 2289;
19252 }
19253 }
19254 // Female
19255 else switch (skinColor)
19256 {
19257 case 0: // Dark (Black)
19258 case 1:
19259 return 29418;
19260 case 2: // White
19261 case 3:
19262 return 29419;
19263 case 6: // Light Brown/Grey
19264 case 7:
19265 case 8:
19266 case 9:
19267 return 29420;
19268 case 10: // Completly White
19269 return 29421;
19270 default: // original - Brown
19271 return 2289;
19272 }
19273 }
19275 return 2281;
19276 else
19277 return 2289;
19278 case FORM_FLIGHT:
19280 return 20857;
19281 return 20872;
19282 case FORM_FLIGHT_EPIC:
19284 return 21243;
19285 return 21244;
19286 default:
19287 break;
19288 }
19289 }
19290
19291 uint32 modelid = 0;
19292 SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);
19293 if (formEntry && formEntry->modelID_A)
19294 {
19295 // Take the alliance modelid as default
19296 if (GetTypeId() != TYPEID_PLAYER)
19297 return formEntry->modelID_A;
19298 else
19299 {
19301 modelid = formEntry->modelID_A;
19302 else
19303 modelid = formEntry->modelID_H;
19304
19305 // If the player is horde but there are no values for the horde modelid - take the alliance modelid
19306 if (!modelid && Player::TeamIdForRace(getRace()) == TEAM_HORDE)
19307 modelid = formEntry->modelID_A;
19308 }
19309 }
19310
19311 return modelid;
19312}
@ FORM_DIREBEAR
Definition: UnitDefines.h:77
@ FORM_FLIGHT_EPIC
Definition: UnitDefines.h:94
@ FORM_CAT
Definition: UnitDefines.h:70
@ FORM_FLIGHT
Definition: UnitDefines.h:96
@ FORM_BEAR
Definition: UnitDefines.h:74
@ PLAYER_BYTES
Definition: UpdateFields.h:181
@ GENDER_MALE
Definition: SharedDefines.h:61
@ RACE_NIGHTELF
Definition: SharedDefines.h:74
@ RACE_TAUREN
Definition: SharedDefines.h:76
@ TEAM_ALLIANCE
Definition: SharedDefines.h:760
@ TEAM_HORDE
Definition: SharedDefines.h:761
static TeamId TeamIdForRace(uint8 race)
Definition: Player.cpp:5786
uint8 getGender() const
Definition: Unit.h:767
uint8 getRace(bool original=false) const
Definition: Unit.cpp:20885
uint32 modelID_H
Definition: DBCStructure.h:1827
uint32 modelID_A
Definition: DBCStructure.h:1826

References FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_FLIGHT, FORM_FLIGHT_EPIC, GENDER_MALE, Object::GetByteValue(), getGender(), getRace(), Object::GetTypeId(), Object::IsPlayer(), SpellShapeshiftFormEntry::modelID_A, SpellShapeshiftFormEntry::modelID_H, PLAYER_BYTES, RACE_NIGHTELF, RACE_TAUREN, sSpellShapeshiftFormStore, TEAM_ALLIANCE, TEAM_HORDE, Player::TeamIdForRace(), and TYPEID_PLAYER.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), and RestoreDisplayId().

◆ GetModelForTotem()

uint32 Unit::GetModelForTotem ( PlayerTotemType  totemType)
19315{
19316 switch (getRace())
19317 {
19318 case RACE_ORC:
19319 {
19320 switch (totemType)
19321 {
19322 case SUMMON_TYPE_TOTEM_FIRE: // fire
19323 return 30758;
19324 case SUMMON_TYPE_TOTEM_EARTH: // earth
19325 return 30757;
19326 case SUMMON_TYPE_TOTEM_WATER: // water
19327 return 30759;
19328 case SUMMON_TYPE_TOTEM_AIR: // air
19329 return 30756;
19330 }
19331 break;
19332 }
19333 case RACE_DWARF:
19334 {
19335 switch (totemType)
19336 {
19337 case SUMMON_TYPE_TOTEM_FIRE: // fire
19338 return 30754;
19339 case SUMMON_TYPE_TOTEM_EARTH: // earth
19340 return 30753;
19341 case SUMMON_TYPE_TOTEM_WATER: // water
19342 return 30755;
19343 case SUMMON_TYPE_TOTEM_AIR: // air
19344 return 30736;
19345 }
19346 break;
19347 }
19348 case RACE_TROLL:
19349 {
19350 switch (totemType)
19351 {
19352 case SUMMON_TYPE_TOTEM_FIRE: // fire
19353 return 30762;
19354 case SUMMON_TYPE_TOTEM_EARTH: // earth
19355 return 30761;
19356 case SUMMON_TYPE_TOTEM_WATER: // water
19357 return 30763;
19358 case SUMMON_TYPE_TOTEM_AIR: // air
19359 return 30760;
19360 }
19361 break;
19362 }
19363 case RACE_TAUREN:
19364 {
19365 switch (totemType)
19366 {
19367 case SUMMON_TYPE_TOTEM_FIRE: // fire
19368 return 4589;
19369 case SUMMON_TYPE_TOTEM_EARTH: // earth
19370 return 4588;
19371 case SUMMON_TYPE_TOTEM_WATER: // water
19372 return 4587;
19373 case SUMMON_TYPE_TOTEM_AIR: // air
19374 return 4590;
19375 }
19376 break;
19377 }
19378 case RACE_DRAENEI:
19379 {
19380 switch (totemType)
19381 {
19382 case SUMMON_TYPE_TOTEM_FIRE: // fire
19383 return 19074;
19384 case SUMMON_TYPE_TOTEM_EARTH: // earth
19385 return 19073;
19386 case SUMMON_TYPE_TOTEM_WATER: // water
19387 return 19075;
19388 case SUMMON_TYPE_TOTEM_AIR: // air
19389 return 19071;
19390 }
19391 break;
19392 }
19393 default: // One standard for other races.
19394 {
19395 switch (totemType)
19396 {
19397 case SUMMON_TYPE_TOTEM_FIRE: // fire
19398 return 4589;
19399 case SUMMON_TYPE_TOTEM_EARTH: // earth
19400 return 4588;
19401 case SUMMON_TYPE_TOTEM_WATER: // water
19402 return 4587;
19403 case SUMMON_TYPE_TOTEM_AIR: // air
19404 return 4590;
19405 }
19406 break;
19407 }
19408 }
19409 return 0;
19410}
@ SUMMON_TYPE_TOTEM_EARTH
Definition: Unit.h:608
@ SUMMON_TYPE_TOTEM_WATER
Definition: Unit.h:609
@ SUMMON_TYPE_TOTEM_FIRE
Definition: Unit.h:607
@ SUMMON_TYPE_TOTEM_AIR
Definition: Unit.h:610
@ RACE_TROLL
Definition: SharedDefines.h:78
@ RACE_ORC
Definition: SharedDefines.h:72
@ RACE_DRAENEI
Definition: SharedDefines.h:81
@ RACE_DWARF
Definition: SharedDefines.h:73

References getRace(), RACE_DRAENEI, RACE_DWARF, RACE_ORC, RACE_TAUREN, RACE_TROLL, SUMMON_TYPE_TOTEM_AIR, SUMMON_TYPE_TOTEM_EARTH, SUMMON_TYPE_TOTEM_FIRE, and SUMMON_TYPE_TOTEM_WATER.

◆ GetModifierValue()

float Unit::GetModifierValue ( UnitMods  unitMod,
UnitModifierType  modifierType 
) const
15202{
15203 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15204 {
15205 LOG_ERROR("entities.unit", "attempt to access non-existing modifier value from UnitMods!");
15206 return 0.0f;
15207 }
15208
15209 if (modifierType == TOTAL_PCT && m_auraModifiersGroup[unitMod][modifierType] <= 0.0f)
15210 return 0.0f;
15211
15212 return m_auraModifiersGroup[unitMod][modifierType];
15213}
@ MODIFIER_TYPE_END
Definition: Unit.h:130

References LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, TOTAL_PCT, and UNIT_MOD_END.

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectWeaponDmg(), Guardian::UpdateArmor(), Player::UpdateArmor(), Creature::UpdateAttackPowerAndDamage(), Guardian::UpdateAttackPowerAndDamage(), Player::UpdateAttackPowerAndDamage(), Guardian::UpdateDamagePhysical(), Guardian::UpdateMaxHealth(), Player::UpdateMaxHealth(), Guardian::UpdateMaxPower(), Player::UpdateMaxPower(), and Player::UpdateResistances().

◆ GetMotionMaster() [1/2]

MotionMaster * Unit::GetMotionMaster ( )
inline
1604{ return i_motionMaster; }

References i_motionMaster.

Referenced by _ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), PetAI::_stopAttack(), BattlegroundAV::AddAVCreature(), npc_mograine::npc_mograineAI::AshbringerEvent(), UnitAI::AttackStart(), FollowerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_illidan_stormrage::boss_illidan_stormrageAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alyson_antille::boss_alyson_antilleAI::AttackStart(), boss_gazakrothAI::AttackStart(), boss_slither::boss_slitherAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::AttackStart(), boss_magus_telestra::boss_magus_telestraAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_high_nethermancer_zerevor::AttackStart(), boss_lady_malande::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), UnitAI::AttackStartCaster(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CleanupBeforeRemoveFromMap(), boss_isalien::DamageTaken(), boss_julianne::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_nightbane::DoAction(), npc_apothecary_genericAI::DoAction(), npc_chained_spirit::DoAction(), boss_anetheron::DoAction(), boss_azgalor::DoAction(), boss_kazrogal::DoAction(), boss_rage_winterchill::DoAction(), npc_hyjal_ground_trash::DoAction(), npc_hyjal_gargoyle::DoAction(), npc_hyjal_frost_wyrm::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_saurfang_event::npc_saurfang_eventAI::DoAction(), boss_professor_putricide::boss_professor_putricideAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_argent_captainAI::DoAction(), npc_icc_spire_frostwyrm::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::DoAction(), npc_ahune_bunny::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_living_mojo::npc_living_mojoAI::DoAction(), npc_power_spark::npc_power_sparkAI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_ambassador_hellmaw::DoAction(), npc_akama_illidan::npc_akama_illidanAI::DoAction(), npc_akama_shade::DoAction(), boss_nazan::DoAction(), boss_ghazan::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), PetAI::DoAttack(), Creature::DoFleeToGetAssistance(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoStartMovement(), ScriptedAI::DoStartNoMovement(), go_commandscript::DoTeleport(), Spell::EffectCharge(), Spell::EffectChargeDest(), Spell::EffectDistract(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectPullTowards(), Spell::EffectSummonType(), boss_jindo::EnterEvadeMode(), npc_black_morass_summoned_add::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), npc_burning_spirit::npc_burning_spiritAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), boss_halazzi::EnterPhase(), boss_zuljin::boss_zuljinAI::EnterPhase(), VehicleDespawnEvent::Execute(), RestoreAttack::Execute(), OrcMoveEvent::Execute(), NpcRunToHome::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), FrostwyrmLandEvent::Execute(), SACActivateEvent::Execute(), AssistanceMovementGenerator::Finalize(), npc_dark_iron_guzzler::FindNextKeg(), npc_hallows_end_soh::FinishEvent(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), boss_nightbane::FlyToClosestPreFlyWayPoint(), Creature::FocusTarget(), CreatureGroup::FormationReset(), boss_volkhan::boss_volkhanAI::GoToAnvil(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_apothecary_lingering_fumes::HandleAfterCast(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), misc_commandscript::HandleAppearCommand(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), misc_commandscript::HandleComeToMeCommand(), spell_q12589_shoot_rjr::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_icc_geist_alarm::HandleEvent(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), spell_item_toxic_wasteling::HandleJump(), AuraEffect::HandleModPossessPet(), misc_commandscript::HandleMovegensCommand(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcFollowCommand(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), npc_commandscript::HandleNpcUnFollowCommand(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), spell_entropius_black_hole_effect::HandlePull(), spell_boss_magus_telestra_gravity_well::HandlePull(), PetAI::HandleReturnMovement(), spell_the_lich_king_valkyr_target_search::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_gen_ayamiss_swarmer_loop::HandleScript(), WorldSession::HandleSetRaidDifficultyOpcode(), spell_sindragosa_icy_grip_jump::HandleSpecial(), spell_item_draenic_pale_ale::HandleSummon(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), wp_commandscript::HandleWpLoadCommand(), wp_commandscript::HandleWpUnLoadCommand(), boss_captain_skarloc::InitializeAI(), boss_lieutenant_drake::InitializeAI(), boss_glob_of_viscidus::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), boss_eck::boss_eckAI::InitializeAI(), npc_preparations_for_war_vehicle::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), boss_grand_warlock_nethekurse::IntroRP(), Creature::IsFreeToMove(), IsMutualChase(), boss_gahzranka::boss_gahzrankaAI::IsSummonedBy(), boss_aeonus::IsSummonedBy(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), JumpTo(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), boss_ayamiss::JustDied(), npc_cyclone::JustEngagedWith(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_grandmaster_vorpil::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nazan::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_alar::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), SmartAI::JustReachedHome(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::JustReachedHome(), boss_ghazan::JustReachedHome(), boss_grand_warlock_nethekurse::JustReachedHome(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_auriaya::boss_auriayaAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustSummoned(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::JustSummoned(), boss_vexallus::JustSummoned(), npc_kalecgos_kj::npc_kalecgos_kjAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_hadronox::boss_hadronoxAI::JustSummoned(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_akama_shade::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), Player::KillPlayer(), KnockbackFrom(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), Player::LeaveBattleground(), Creature::Motion_Initialize(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), PetAI::MovementInform(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), NearTeleportTo(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_omen::npc_omenAI::npc_omenAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::npc_pos_after_first_bossAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::npc_ulduar_saronite_vaporsAI(), spell_halion_twilight_phasing_aura::OnApply(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_hyjal_jaina::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_kernobee::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), spell_chapter5_light_of_dawn_aura::spell_chapter5_light_of_dawn_aura_AuraScript::OnRemove(), spell_halion_twilight_phasing_aura::OnRemove(), SplineHandler::operator()(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), npc_vics_flying_machine::npc_vics_flying_machineAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), boss_nefarian::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), PauseMovement(), SmartAI::PausePath(), PetSpellFail(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), propagateSpeedChange(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), RemoveCharmedBy(), boss_the_beast::boss_thebeastAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_kalec::boss_kalecAI::Reset(), npc_janalai_hatchling::npc_janalai_hatchlingAI::Reset(), boss_arlokk::boss_arlokkAI::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), npc_batrider::Reset(), npc_brew_bubble::Reset(), boss_archimonde::Reset(), boss_ayamiss::Reset(), boss_bug_trio::Reset(), boss_jedoga_shadowseeker::Reset(), npc_kinetic_bomb::npc_kinetic_bombAI::Reset(), npc_assembly_lightning::npc_assembly_lightningAI::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_released_offspring_harkoa::npc_released_offspring_harkoaAI::Reset(), npc_voidtraveler::Reset(), boss_lady_vashj::Reset(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_pet_gen_gnomish_flame_turret::Reset(), Creature::Respawn(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), ResumeMovement(), SmartAI::ResumePath(), Resurrect(), SmartAI::ReturnToLastOOCPos(), npc_escortAI::ReturnToLastPoint(), boss_magtheridon::ScheduleCombatEvents(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), boss_nightbane::ScheduleLand(), boss_laj::ScheduleTasks(), boss_selin_fireheart::SelectNearestCrystal(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), WorldSession::SendDoFlight(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_grand_warlock_nethekurse::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), gunship_npc_AI::SetData(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_eastvale_peasent::SetData(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::SetData(), setDeathState(), Creature::setDeathState(), SetFeared(), SmartAI::SetFollow(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), SetInCombatState(), Player::SetMover(), SetSpeed(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_illidan::npc_akama_illidanAI::sGossipSelect(), npc_akama_shade::sGossipSelect(), boss_thorim::boss_thorimAI::SpawnArenaNPCs(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_death_knight_initiate::npc_death_knight_initiateAI::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_forest_frog::npc_forest_frogAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), npc_pet_gen_fetch_ball::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_escortAI::Start(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), FollowerAI::StartFollow(), WaypointMovementGenerator< Creature >::StartMove(), npc_stillpine_capitive::npc_stillpine_capitiveAI::StartMoving(), SmartAI::StartPath(), SmartAI::StopFollow(), SmartAI::StopPath(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_vazruden_the_herald::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), Spell::SummonGuardian(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave(), Player::TeleportTo(), CreatureAI::TriggerAlert(), Pet::Update(), Update(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_gyth::boss_gythAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_eye_of_acherus::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), npc_cameron::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_akilzon_eagle::npc_akilzon_eagleAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), npc_janalai_hatcher::npc_janalai_hatcherAI::UpdateAI(), npc_forest_frog::npc_forest_frogAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), npc_taldaram_flamesphere::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_venture_co_straggler::npc_venture_co_stragglerAI::UpdateAI(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_demonic_vapor::npc_demonic_vaporAI::UpdateAI(), npc_batrider::UpdateAI(), npc_concentrated_ball::npc_concentrated_ballAI::UpdateAI(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::UpdateAI(), npc_xt002_boombot::npc_xt002_boombotAI::UpdateAI(), Player::UpdateCharmedAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ GetMotionMaster() [2/2]

const MotionMaster * Unit::GetMotionMaster ( ) const
inline
1605{ return i_motionMaster; }

References i_motionMaster.

◆ GetMountID()

◆ GetNativeDisplayId()

◆ GetNativeObjectScale()

virtual float Unit::GetNativeObjectScale ( ) const
inlinevirtual

Reimplemented in Creature, and Pet.

1508{ return 1.0f; }

Referenced by RecalculateObjectScale().

◆ GetNegStat()

float Unit::GetNegStat ( Stats  stat) const
inline
1386{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_NEGSTAT0.

◆ GetNextRandomRaidMemberOrPet()

Unit * Unit::GetNextRandomRaidMemberOrPet ( float  radius)
11036{
11037 Player* player = nullptr;
11038 if (IsPlayer())
11039 player = ToPlayer();
11040 // Should we enable this also for charmed units?
11041 else if (GetTypeId() == TYPEID_UNIT && IsPet())
11042 player = GetOwner()->ToPlayer();
11043
11044 if (!player)
11045 return nullptr;
11046 Group* group = player->GetGroup();
11047 // When there is no group check pet presence
11048 if (!group)
11049 {
11050 // We are pet now, return owner
11051 if (player != this)
11052 return IsWithinDistInMap(player, radius) ? player : nullptr;
11053 Unit* pet = GetGuardianPet();
11054 // No pet, no group, nothing to return
11055 if (!pet)
11056 return nullptr;
11057 // We are owner now, return pet
11058 return IsWithinDistInMap(pet, radius) ? pet : nullptr;
11059 }
11060
11061 std::vector<Unit*> nearMembers;
11062 // reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
11063 nearMembers.reserve(group->GetMembersCount() * 2);
11064
11065 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
11066 if (Player* Target = itr->GetSource())
11067 {
11068 if (Target != this && !IsWithinDistInMap(Target, radius))
11069 continue;
11070
11071 // IsHostileTo check duel and controlled by enemy
11072 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
11073 nearMembers.push_back(Target);
11074
11075 // Push player's pet to vector
11076 if (Unit* pet = Target->GetGuardianPet())
11077 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
11078 nearMembers.push_back(pet);
11079 }
11080
11081 if (nearMembers.empty())
11082 return nullptr;
11083
11084 uint32 randTarget = urand(0, nearMembers.size() - 1);
11085 return nearMembers[randTarget];
11086}
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition: Object.cpp:1321
Group * GetGroup()
Definition: Player.h:2444
Guardian * GetGuardianPet() const
Definition: Unit.cpp:10577
Definition: Group.h:169
uint32 GetMembersCount() const
Definition: Group.h:245
GroupReference * GetFirstMember()
Definition: Group.h:243
Definition: GroupReference.h:27
GroupReference * next()
Definition: GroupReference.h:36

References Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), Group::GetMembersCount(), GetOwner(), Object::GetTypeId(), IsHostileTo(), IsPet(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), GroupReference::next(), Object::ToPlayer(), TYPEID_UNIT, and urand().

Referenced by HandleAuraRaidProcFromCharge(), and AuraEffect::HandleRaidProcFromChargeAuraProc().

◆ GetNpcFlags()

◆ GetOldFactionId()

uint32 Unit::GetOldFactionId ( ) const
inline
1806{ return _oldFactionId; }

References _oldFactionId.

Referenced by npc_chesspiece::OnCharmed().

◆ GetOwnedAura()

Aura * Unit::GetOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
Aura except = nullptr 
) const
4716{
4717 AuraMapBounds range = m_ownedAuras.equal_range(spellId);
4718 for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
4719 {
4720 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
4721 && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
4722 && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
4723 && (!except || except != itr->second))
4724 {
4725 return itr->second;
4726 }
4727 }
4728 return nullptr;
4729}
std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
Definition: Unit.h:636

References m_ownedAuras.

Referenced by _TryStackingOrRefreshingExistingAura().

◆ GetOwnedAuras() [1/2]

◆ GetOwnedAuras() [2/2]

AuraMap const & Unit::GetOwnedAuras ( ) const
inline
1257{ return m_ownedAuras; }

References m_ownedAuras.

◆ GetOwner()

Unit * Unit::GetOwner ( ) const
10527{
10528 if (ObjectGuid ownerGUID = GetOwnerGUID())
10529 return ObjectAccessor::GetUnit(*this, ownerGUID);
10530
10531 return nullptr;
10532}

References GetOwnerGUID(), and ObjectAccessor::GetUnit().

Referenced by _ExitVehicle(), Acore::AnyAoETargetUnitInObjectRangeCheck::AnyAoETargetUnitInObjectRangeCheck(), ApplyDiminishingToDuration(), ApplyResilience(), TotemAI::AttackStart(), spell_dk_anti_magic_zone::CalculateAmount(), Creature::CanStartAttack(), spell_dk_blood_gorged::CheckProc(), spell_pri_mana_leech::CheckProc(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), DealHeal(), HostileRefMgr::deleteReferences(), npc_spring_rabbit::npc_spring_rabbitAI::DoAction(), Spell::DoAllEffectOnLaunchTarget(), Spell::DoAllEffectOnTarget(), PetAI::DoAttack(), Spell::EffectDispel(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), GetCharmerOrOwner(), GetCombatRatingReduction(), GetNextRandomRaidMemberOrPet(), GetReactionTo(), GetSpellModOwner(), spell_warl_seduction::HandleAuraApply(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_sha_healing_stream_totem::HandleDummy(), spell_q12277_wintergarde_mine_explosion::HandleDummy(), spell_sha_mana_tide_totem::HandleDummy(), HandleDummyAuraProc(), spell_mount_check_aura::HandleEffectPeriodic(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), modify_commandscript::HandleModifyTalentCommand(), WorldSession::HandlePetActionHelper(), spell_warl_demonic_pact_aura::HandleProc(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::InitializeAI(), npc_pet_dk_dancing_rune_weapon::npc_pet_dk_dancing_rune_weaponAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), IsAlwaysVisibleFor(), IsPetAura(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::JustDied(), Kill(), MagicSpellHitResult(), MeleeDamageBonusDone(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_khunok_the_behemoth::npc_khunok_the_behemothAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_hun_aspect_of_the_beast::OnPetApply(), Acore::MostHPMissingGroupInRange::operator()(), PetSpellFail(), RemoveFromWorld(), npc_target_dummy::npc_target_dummyAI::Reset(), npc_spring_rabbit::npc_spring_rabbitAI::Reset(), RestoreFaction(), Creature::SelectVictim(), SendPetActionFeedback(), SendPetAIReaction(), SendPetTalk(), SetHealth(), SetMaxHealth(), SetMaxPower(), SetPower(), setPowerType(), SetStunned(), SpellDamageBonusDone(), SpellHealingBonusDone(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and UpdateAuraForGroup().

◆ GetOwnerGUID()

ObjectGuid Unit::GetOwnerGUID ( ) const
inline
@ UNIT_FIELD_SUMMONEDBY
Definition: UpdateFields.h:90

References Object::GetGuidValue(), and UNIT_FIELD_SUMMONEDBY.

Referenced by Pet::AddToWorld(), npc_living_mojo::npc_living_mojoAI::AttackStart(), BuildValuesUpdate(), PetAI::CanAttack(), CanFreeMove(), CanHaveThreatList(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), DealDamage(), Spell::DoAllEffectOnTarget(), FollowMovementGenerator< T >::DoUpdate(), GetCharmerOrOwnerGUID(), GetOwner(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModStealthLevel(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetRename(), HandleSpellClick(), Creature::HasMechanicTemplateImmunity(), Creature::IsDungeonBoss(), Creature::IsImmuneToKnockback(), isInAccessiblePlaceFor(), Kill(), Creature::LoadSpellTemplateImmunity(), Condition::Meets(), instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_venomhide_hatchling::OnGossipHello(), Acore::MostHPMissingGroupInRange::operator()(), PlayerOrPetCheck::operator()(), OutDebugInfo(), PetAI::ReceiveEmote(), Creature::Regenerate(), RemoveAllControlled(), RemoveEvadeAuras(), Pet::SavePetToDB(), SetMinion(), SetOwnerGUID(), SpellPctDamageModsDone(), Map::SummonCreature(), NPCStaveQuestAI::UnitIsUnfair(), Creature::Update(), and npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI().

◆ GetPartyMembers()

void Unit::GetPartyMembers ( std::list< Unit * > &  units)
18723{
18724 Unit* owner = GetCharmerOrOwnerOrSelf();
18725 Group* group = nullptr;
18726 if (owner->IsPlayer())
18727 group = owner->ToPlayer()->GetGroup();
18728
18729 if (group)
18730 {
18731 uint8 subgroup = owner->ToPlayer()->GetSubGroup();
18732
18733 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
18734 {
18735 Player* Target = itr->GetSource();
18736
18737 // IsHostileTo check duel and controlled by enemy
18738 if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
18739 {
18740 if (Target->IsAlive())
18741 TagUnitMap.push_back(Target);
18742
18743 for (Unit::ControlSet::iterator iterator = Target->m_Controlled.begin(); iterator != Target->m_Controlled.end(); ++iterator)
18744 {
18745 if (Unit* pet = *iterator)
18746 if (pet->IsGuardian() && pet->IsAlive())
18747 TagUnitMap.push_back(pet);
18748 }
18749 }
18750 }
18751 }
18752 else
18753 {
18754 if (owner->IsAlive())
18755 TagUnitMap.push_back(owner);
18756
18757 for (Unit::ControlSet::iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
18758 {
18759 if (Unit* pet = *itr)
18760 if (pet->IsGuardian() && pet->IsAlive())
18761 TagUnitMap.push_back(pet);
18762 }
18763 }
18764}
uint8 GetSubGroup() const
Definition: Player.h:2448

References GetCharmerOrOwnerOrSelf(), Group::GetFirstMember(), Player::GetGroup(), Player::GetSubGroup(), IsAlive(), IsHostileTo(), WorldObject::IsInMap(), Object::IsPlayer(), m_Controlled, GroupReference::next(), and Object::ToPlayer().

Referenced by spell_warr_improved_spell_reflection_trigger_aura::HandleRemove().

◆ GetPetGUID()

◆ GetPhaseByAuras()

uint32 Unit::GetPhaseByAuras ( ) const
18942{
18943 uint32 currentPhase = 0;
18945 if (!phases.empty())
18946 for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
18947 currentPhase |= (*itr)->GetMiscValue();
18948
18949 return currentPhase;
18950}
@ SPELL_AURA_PHASE
Definition: SpellAuraDefines.h:324

References GetAuraEffectsByType(), and SPELL_AURA_PHASE.

Referenced by Player::GetPhaseMaskForSpawn(), AuraEffect::HandlePhase(), and Player::SetGameMaster().

◆ GetPosStat()

float Unit::GetPosStat ( Stats  stat) const
inline
1385{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_POSSTAT0.

◆ GetPower()

uint32 Unit::GetPower ( Powers  power) const
inline
803{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power); }
@ UNIT_FIELD_POWER1
Definition: UpdateFields.h:97

References Object::GetUInt32Value(), and UNIT_FIELD_POWER1.

Referenced by PetAI::_canMeleeAttack(), Player::_SaveCharacter(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_igb_cannon_blast::CalculatePower(), Creature::CanCastSpell(), Spell::CheckItems(), Spell::CheckPower(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), Spell::EffectCastButtons(), Spell::EffectWeaponDmg(), Pet::FillPetInfo(), Pet::GetHappinessState(), GetPowerPct(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), AuraEffect::HandleObsModPowerAuraTick(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetAbandon(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_pal_lay_on_hands::HandleScript(), Player::InitStatsForLevel(), npc_obsidian_destroyer::JustEngagedWith(), spell_gen_replenishment_aura::Load(), Pet::LoseHappiness(), ModifyPower(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), Acore::PowerPctOrderPred::operator()(), SmartScript::ProcessAction(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::Regenerate(), Player::Regenerate(), Creature::RegenerateHealth(), Player::SaveManaBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), ScriptedAI::SelectSpell(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetMaxPower(), SetPower(), setPowerType(), spell_igb_incinerating_blast::StoreEnergy(), Aura::Update(), boss_selin_fireheart::UpdateAI(), boss_moam::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), PetAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ GetPowerPct()

float Unit::GetPowerPct ( Powers  power) const
inline
792{ return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; }
uint32 GetMaxPower(Powers power) const
Definition: Unit.h:804
uint32 GetPower(Powers power) const
Definition: Unit.h:803

References GetMaxPower(), and GetPower().

Referenced by npc_obsidian_destroyer::JustEngagedWith(), npc_obsidian_eradicator::JustEngagedWith(), npc_obsidian_nullifier::JustEngagedWith(), boss_curator::JustEngagedWith(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), and boss_hazzarah::UpdateAI().

◆ getPowerType()

◆ GetPowerTypeByAuraGroup()

Powers Unit::GetPowerTypeByAuraGroup ( UnitMods  unitMod) const
15320{
15321 switch (unitMod)
15322 {
15323 case UNIT_MOD_RAGE:
15324 return POWER_RAGE;
15325 case UNIT_MOD_FOCUS:
15326 return POWER_FOCUS;
15327 case UNIT_MOD_ENERGY:
15328 return POWER_ENERGY;
15329 case UNIT_MOD_HAPPINESS:
15330 return POWER_HAPPINESS;
15331 case UNIT_MOD_RUNE:
15332 return POWER_RUNE;
15334 return POWER_RUNIC_POWER;
15335 default:
15336 case UNIT_MOD_MANA:
15337 return POWER_MANA;
15338 }
15339}
@ UNIT_MOD_RUNE
Definition: Unit.h:154
@ UNIT_MOD_ENERGY
Definition: Unit.h:152
@ UNIT_MOD_FOCUS
Definition: Unit.h:151
@ UNIT_MOD_HAPPINESS
Definition: Unit.h:153
@ UNIT_MOD_MANA
Definition: Unit.h:149
@ UNIT_MOD_RAGE
Definition: Unit.h:150
@ UNIT_MOD_RUNIC_POWER
Definition: Unit.h:155

References POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RUNE, and UNIT_MOD_RUNIC_POWER.

Referenced by HandleStatModifier().

◆ GetPPMProcChance()

float Unit::GetPPMProcChance ( uint32  WeaponSpeed,
float  PPM,
SpellInfo const *  spellProto 
) const
13373{
13374 // proc per minute chance calculation
13375 if (PPM <= 0)
13376 return 0.0f;
13377
13378 // Apply chance modifer aura
13379 if (spellProto)
13380 if (Player* modOwner = GetSpellModOwner())
13381 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM);
13382
13383 return floor((WeaponSpeed * PPM) / 600.0f); // result is chance in percents (probability = Speed_in_sec * (PPM / 60))
13384}
@ SPELLMOD_PROC_PER_MINUTE
Definition: SpellDefines.h:103

References GetSpellModOwner(), SpellInfo::Id, and SPELLMOD_PROC_PER_MINUTE.

Referenced by Player::CastItemCombatSpell(), and IsTriggeredAtSpellProcEvent().

◆ GetProcAurasTriggeredOnEvent()

void Unit::GetProcAurasTriggeredOnEvent ( std::list< AuraApplication * > &  aurasTriggeringProc,
std::list< AuraApplication * > *  procAuras,
ProcEventInfo  eventInfo 
)
16428{
16429 // use provided list of auras which can proc
16430 if (procAuras)
16431 {
16432 for (std::list<AuraApplication*>::iterator itr = procAuras->begin(); itr != procAuras->end(); ++itr)
16433 {
16434 ASSERT((*itr)->GetTarget() == this);
16435 if (!(*itr)->GetRemoveMode())
16436 if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
16437 {
16438 (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
16439 aurasTriggeringProc.push_back(*itr);
16440 }
16441 }
16442 }
16443 // or generate one on our own
16444 else
16445 {
16446 for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16447 {
16448 if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
16449 {
16450 itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
16451 aurasTriggeringProc.push_back(itr->second);
16452 }
16453 }
16454 }
16455}

References ASSERT, and GetAppliedAuras().

Referenced by TriggerAurasProcOnEvent().

◆ getRace()

uint8 Unit::getRace ( bool  original = false) const
20886{
20887 if (IsPlayer())
20888 {
20889 if (original)
20890 return m_realRace;
20891 else
20892 return m_race;
20893 }
20894
20896}

References Object::GetByteValue(), Object::IsPlayer(), m_race, m_realRace, and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), Player::BuildPlayerRepop(), Corpse::BuildValuesUpdate(), Player::CreateCorpse(), GetModelForForm(), GetModelForTotem(), getRaceMask(), GetReactionTo(), Player::GetStartPosition(), Player::GetTeamId(), Player::GiveLevel(), WorldSession::HandleAlterAppearance(), AuraEffect::HandleAuraTransform(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Creature::IsValidTrainerForPlayer(), Channel::KickOrBan(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), RestoreFaction(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Player::SetGameMaster(), Player::StoreNewItemInBestSlots(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getRaceMask()

◆ GetRandomContactPoint()

bool Unit::GetRandomContactPoint ( Unit const *  target,
float &  x,
float &  y,
float &  z,
bool  force = false 
) const
702{
703 float combat_reach = GetCombatReach();
704 if (combat_reach < 0.1f) // sometimes bugged for players
705 combat_reach = DEFAULT_COMBAT_REACH;
706
707 uint32 attacker_number = getAttackers().size();
708 if (attacker_number > 0)
709 --attacker_number;
710 Creature const* c = obj->ToCreature();
711 if (c)
712 if (c->isWorldBoss() || c->IsDungeonBoss() || (obj->IsPet() && const_cast<Unit*>(obj)->ToPet()->isControlled()))
713 attacker_number = 0; // pussywizard: pets and bosses just come to target from their angle
714
715 GetNearPoint(obj, x, y, z, isMoving() ? (obj->GetCombatReach() > 7.75f ? obj->GetCombatReach() - 7.5f : 0.25f) : obj->GetCombatReach(), 0.0f,
716 GetAngle(obj) + (attacker_number ? (static_cast<float>(M_PI / 2) - static_cast<float>(M_PI) * (float)rand_norm()) * float(attacker_number) / combat_reach * 0.3f : 0));
717
718 // pussywizard
719 if (std::fabs(this->GetPositionZ() - z) > this->GetCollisionHeight() || !IsWithinLOS(x, y, z))
720 {
721 x = this->GetPositionX();
722 y = this->GetPositionY();
723 z = this->GetPositionZ();
724 obj->UpdateAllowedPositionZ(x, y, z);
725 }
726 float maxDist = GetMeleeRange(obj);
727 if (GetExactDistSq(x, y, z) >= maxDist * maxDist)
728 {
729 if (force)
730 {
731 x = this->GetPositionX();
732 y = this->GetPositionY();
733 z = this->GetPositionZ();
734 return true;
735 }
736 return false;
737 }
738 return true;
739}
#define DEFAULT_COMBAT_REACH
Definition: ObjectDefines.h:46
bool IsDungeonBoss() const
Definition: Creature.cpp:3131
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
Definition: Object.cpp:1326
float GetExactDistSq(float x, float y, float z) const
Definition: Position.h:170
bool isControlled() const
Definition: Pet.h:54
float GetCollisionHeight() const override
Return collision height sent to client.
Definition: Unit.cpp:20985
float GetMeleeRange(Unit const *target) const
Definition: Unit.cpp:680

References DEFAULT_COMBAT_REACH, Position::GetAngle(), getAttackers(), GetCollisionHeight(), GetCombatReach(), Position::GetExactDistSq(), GetMeleeRange(), WorldObject::GetNearPoint(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Pet::isControlled(), Creature::IsDungeonBoss(), isMoving(), IsPet(), WorldObject::IsWithinLOS(), Creature::isWorldBoss(), rand_norm(), Object::ToCreature(), ToPet(), and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_bug_trio::DamageTaken(), and boss_bug_trio::DoFinalSpell().

◆ GetRangedCritChanceReduction()

float Unit::GetRangedCritChanceReduction ( ) const
inline

◆ GetRangedCritDamageReduction()

uint32 Unit::GetRangedCritDamageReduction ( uint32  damage) const
inline

◆ GetRangedDamageReduction()

uint32 Unit::GetRangedDamageReduction ( uint32  damage) const
inline

◆ GetReactionTo()

ReputationRank Unit::GetReactionTo ( Unit const *  target,
bool  checkOriginalFaction = false 
) const
10000{
10001 // always friendly to self
10002 if (this == target)
10003 return REP_FRIENDLY;
10004
10005 // always friendly to charmer or owner
10007 return REP_FRIENDLY;
10008
10009 Player const* selfPlayerOwner = GetAffectingPlayer();
10010 Player const* targetPlayerOwner = target->GetAffectingPlayer();
10011
10012 // check forced reputation to support SPELL_AURA_FORCE_REACTION
10013 if (selfPlayerOwner)
10014 {
10015 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10016 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10017 return *repRank;
10018 }
10019 else if (targetPlayerOwner)
10020 {
10021 if (FactionTemplateEntry const* selfFactionTemplateEntry = GetFactionTemplateEntry())
10022 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(selfFactionTemplateEntry))
10023 return *repRank;
10024 }
10025
10027 {
10028 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
10029 {
10030 if (selfPlayerOwner && targetPlayerOwner)
10031 {
10032 // always friendly to other unit controlled by player, or to the player himself
10033 if (selfPlayerOwner == targetPlayerOwner)
10034 return REP_FRIENDLY;
10035
10036 // duel - always hostile to opponent
10037 if (selfPlayerOwner->duel && selfPlayerOwner->duel->Opponent == targetPlayerOwner && selfPlayerOwner->duel->State == DUEL_STATE_IN_PROGRESS)
10038 return REP_HOSTILE;
10039
10040 // same group - checks dependant only on our faction - skip FFA_PVP for example
10041 if (selfPlayerOwner->IsInRaidWith(targetPlayerOwner))
10042 return REP_FRIENDLY; // return true to allow config option AllowTwoSide.Interaction.Group to work
10043 // however client seems to allow mixed group parties, because in 13850 client it works like:
10044 // return GetFactionReactionTo(GetFactionTemplateEntry(), target);
10045 }
10046
10047 // check FFA_PVP
10048 if (IsFFAPvP() && target->IsFFAPvP())
10049 return REP_HOSTILE;
10050
10051 if (selfPlayerOwner)
10052 {
10053 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10054 {
10055 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10056 return *repRank;
10057 if (!selfPlayerOwner->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10058 {
10059 if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->faction))
10060 {
10061 if (targetFactionEntry->CanHaveReputation())
10062 {
10063 // check contested flags
10064 if (targetFactionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10065 && selfPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10066 return REP_HOSTILE;
10067
10068 // if faction has reputation, hostile state depends only from AtWar state
10069 if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
10070 return REP_HOSTILE;
10071 return REP_FRIENDLY;
10072 }
10073 }
10074 }
10075 }
10076 }
10077 }
10078 }
10079
10080 ReputationRank repRank = REP_HATED;
10081 if (!sScriptMgr->IfNormalReaction(this, target, repRank))
10082 {
10083 return ReputationRank(repRank);
10084 }
10085
10086 FactionTemplateEntry const* factionTemplateEntry = nullptr;
10087 if (checkOriginalFaction)
10088 {
10089 if (IsPlayer())
10090 {
10091 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
10092 {
10093 factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
10094 }
10095 }
10096 else
10097 {
10098 Unit* owner = GetOwner();
10099 if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
10100 {
10101 factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
10102 }
10103 else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
10104 {
10105 factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
10106 }
10107 }
10108 }
10109
10110 if (!factionTemplateEntry)
10111 {
10112 factionTemplateEntry = GetFactionTemplateEntry();
10113 }
10114
10115 // do checks dependant only on our faction
10116 return GetFactionReactionTo(factionTemplateEntry, target);
10117}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
@ REP_HATED
Definition: SharedDefines.h:180
bool HasPlayerFlag(PlayerFlags flags) const
Definition: Player.h:1107
ReputationRank GetFactionReactionTo(FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
Definition: Unit.cpp:10119
bool IsInRaidWith(Unit const *unit) const
Definition: Unit.cpp:18700
bool IsAtWar(uint32 faction_id) const
Definition: ReputationMgr.cpp:55
Definition: DBCStructure.h:679

References Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), GetCharmerOrOwnerOrSelf(), GetFaction(), GetFactionReactionTo(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetOwner(), getRace(), Player::GetReputationMgr(), Player::HasPlayerFlag(), HasUnitFlag(), HasUnitFlag2(), HasUnitTypeMask(), ReputationMgr::IsAtWar(), IsFFAPvP(), IsInRaidWith(), Object::IsPlayer(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HATED, REP_HOSTILE, sChrRacesStore, sFactionStore, sFactionTemplateStore, sScriptMgr, Object::ToCreature(), UNIT_FLAG2_IGNORE_REPUTATION, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_MINION.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), Player::GetNPCIfCanInteractWith(), IsFriendlyTo(), IsHostileTo(), and Condition::Meets().

◆ GetRedirectThreatPercent()

uint32 Unit::GetRedirectThreatPercent ( )
inline
uint32 GetThreatPct() const
Definition: ThreatMgr.h:300

References _redirectThreatInfo, and RedirectThreatInfo::GetThreatPct().

Referenced by ThreatMgr::DoAddThreat().

◆ GetRedirectThreatTarget()

Unit * Unit::GetRedirectThreatTarget ( ) const

◆ GetResistance() [1/2]

uint32 Unit::GetResistance ( SpellSchoolMask  mask) const
20223{
20224 int32 resist = -1;
20225 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
20226 if (mask & (1 << i) && (resist < 0 || resist > int32(GetResistance(SpellSchools(i)))))
20227 resist = int32(GetResistance(SpellSchools(i)));
20228
20229 // resist value will never be negative here
20230 return uint32(resist);
20231}

References GetResistance(), MAX_SPELL_SCHOOL, and SPELL_SCHOOL_NORMAL.

◆ GetResistance() [2/2]

uint32 Unit::GetResistance ( SpellSchools  school) const
inline
776{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_RESISTANCES) + school); }
@ UNIT_FIELD_RESISTANCES
Definition: UpdateFields.h:156

References Object::GetUInt32Value(), and UNIT_FIELD_RESISTANCES.

Referenced by Player::_SaveStats(), GetArmor(), GetEffectiveResistChance(), GetResistance(), and Player::outDebugValues().

◆ GetResistanceBuffMods()

float Unit::GetResistanceBuffMods ( SpellSchools  school,
bool  positive 
) const
inline

◆ GetShapeshiftForm()

◆ GetSharedVisionList()

◆ GetSheath()

SheathState Unit::GetSheath ( ) const
inline
SheathState
Definition: UnitDefines.h:104

References Object::GetByteValue(), and UNIT_FIELD_BYTES_2.

◆ GetShieldBlockValue() [1/2]

virtual uint32 Unit::GetShieldBlockValue ( ) const
pure virtual

◆ GetShieldBlockValue() [2/2]

uint32 Unit::GetShieldBlockValue ( uint32  soft_cap,
uint32  hard_cap 
) const
inline
967 {
968 uint32 value = GetShieldBlockValue();
969 if (value >= hard_cap)
970 {
971 value = (soft_cap + hard_cap) / 2;
972 }
973 else if (value > soft_cap)
974 {
975 value = soft_cap + ((value - soft_cap) / 2);
976 }
977
978 return value;
979 }

References GetShieldBlockValue().

◆ GetSingleCastAuras() [1/2]

AuraList & Unit::GetSingleCastAuras ( )
inline

◆ GetSingleCastAuras() [2/2]

AuraList const & Unit::GetSingleCastAuras ( ) const
inline
1311{ return m_scAuras; }

References m_scAuras.

◆ GetSpeed()

◆ GetSpeedRate()

◆ GetSpellCritChanceReduction()

float Unit::GetSpellCritChanceReduction ( ) const
inline

◆ GetSpellCritDamageReduction()

◆ GetSpellDamageReduction()

uint32 Unit::GetSpellDamageReduction ( uint32  damage) const
inline

◆ GetSpellMaxRangeForTarget()

float Unit::GetSpellMaxRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15061{
15062 if (!spellInfo->RangeEntry)
15063 {
15064 return 0;
15065 }
15066
15067 if (spellInfo->RangeEntry->RangeMax[1] == spellInfo->RangeEntry->RangeMax[0])
15068 {
15069 return spellInfo->GetMaxRange();
15070 }
15071
15072 if (!target)
15073 {
15074 return spellInfo->GetMaxRange(true);
15075 }
15076
15077 return spellInfo->GetMaxRange(!IsHostileTo(target));
15078}

References SpellInfo::GetMaxRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMax.

Referenced by spell_sha_fire_nova::CheckFireTotem(), Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), ScriptedAI::SelectSpell(), GameObject::TriggeringLinkedGameObject(), and Pet::Update().

◆ GetSpellMinRangeForTarget()

float Unit::GetSpellMinRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15081{
15082 if (!spellInfo->RangeEntry)
15083 {
15084 return 0;
15085 }
15086
15087 if (spellInfo->RangeEntry->RangeMin[1] == spellInfo->RangeEntry->RangeMin[0])
15088 {
15089 return spellInfo->GetMinRange();
15090 }
15091
15092 return spellInfo->GetMinRange(!IsHostileTo(target));
15093}

References SpellInfo::GetMinRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMin.

Referenced by Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), and ScriptedAI::SelectSpell().

◆ GetSpellModOwner()

Player * Unit::GetSpellModOwner ( ) const
16492{
16493 if (Player* player = const_cast<Unit*>(this)->ToPlayer())
16494 {
16495 return player;
16496 }
16497
16498 if (Unit* owner = GetOwner())
16499 {
16500 if (Player* player = owner->ToPlayer())
16501 {
16502 return player;
16503 }
16504 }
16505
16506 // Special handling for Eye of Kilrogg
16508 {
16509 if (TempSummon const* tempSummon = ToTempSummon())
16510 {
16511 if (Unit* summoner = tempSummon->GetSummonerUnit())
16512 {
16513 return summoner->ToPlayer();
16514 }
16515 }
16516 }
16517
16518 return nullptr;
16519}
@ NPC_EYE_OF_KILROGG
Definition: PetDefines.h:101
Definition: TemporarySummon.h:40

References Object::GetEntry(), GetOwner(), NPC_EYE_OF_KILROGG, Object::ToPlayer(), and ToTempSummon().

Referenced by Spell::_cast(), Creature::AddSpellCooldown(), ApplyEffectModifiers(), CalcArmorReducedDamage(), SpellEffectInfo::CalcDamageMultiplier(), Aura::CalcDispelChance(), Aura::CalcMaxCharges(), Aura::CalcMaxDuration(), AuraEffect::CalcPeriodicCritChance(), SpellInfo::CalcPowerCost(), Aura::CalcProcChance(), SpellEffectInfo::CalcRadius(), ThreatCalcHelper::calcThreat(), spell_dru_brambles_treant::CalculateAmount(), AuraEffect::CalculatePeriodic(), CalculateSpellDamageTaken(), SpellEffectInfo::CalcValueMultiplier(), Spell::cancel(), Spell::cast(), Spell::CheckRange(), Spell::CheckRuneCost(), Spell::EffectSummonPet(), Spell::EffectSummonType(), Spell::finish(), GetEffectiveResistChance(), SpellInfo::GetMaxRange(), GetPPMProcChance(), Spell::handle_delayed(), Spell::handle_immediate(), IsAlwaysDetectableFor(), SpellInfo::IsStrongerAuraActive(), IsTriggeredAtSpellProcEvent(), MagicSpellHitResult(), MeleeDamageBonusDone(), MeleeSpellMissChance(), ModSpellCastTime(), Spell::SelectImplicitChainTargets(), Aura::SetDuration(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHealingBonusDone(), Spell::SummonGuardian(), Spell::TakePower(), Spell::TakeRunePower(), Spell::UpdateChanneledTargetList(), and Aura::UpdateOwner().

◆ GetSpellSchoolByAuraGroup()

SpellSchools Unit::GetSpellSchoolByAuraGroup ( UnitMods  unitMod) const
15259{
15261
15262 switch (unitMod)
15263 {
15265 school = SPELL_SCHOOL_HOLY;
15266 break;
15268 school = SPELL_SCHOOL_FIRE;
15269 break;
15271 school = SPELL_SCHOOL_NATURE;
15272 break;
15274 school = SPELL_SCHOOL_FROST;
15275 break;
15277 school = SPELL_SCHOOL_SHADOW;
15278 break;
15280 school = SPELL_SCHOOL_ARCANE;
15281 break;
15282
15283 default:
15284 break;
15285 }
15286
15287 return school;
15288}
@ UNIT_MOD_RESISTANCE_SHADOW
Definition: Unit.h:161
@ UNIT_MOD_RESISTANCE_FROST
Definition: Unit.h:160
@ UNIT_MOD_RESISTANCE_HOLY
Definition: Unit.h:157
@ UNIT_MOD_RESISTANCE_ARCANE
Definition: Unit.h:162
@ UNIT_MOD_RESISTANCE_FIRE
Definition: Unit.h:158
@ UNIT_MOD_RESISTANCE_NATURE
Definition: Unit.h:159
@ SPELL_SCHOOL_SHADOW
Definition: SharedDefines.h:288
@ SPELL_SCHOOL_NATURE
Definition: SharedDefines.h:286
@ SPELL_SCHOOL_FROST
Definition: SharedDefines.h:287
@ SPELL_SCHOOL_ARCANE
Definition: SharedDefines.h:289
@ SPELL_SCHOOL_FIRE
Definition: SharedDefines.h:285
@ SPELL_SCHOOL_HOLY
Definition: SharedDefines.h:284

References SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, and UNIT_MOD_RESISTANCE_SHADOW.

Referenced by HandleStatModifier().

◆ getStandState()

◆ GetStat()

◆ GetStatByAuraGroup()

Stats Unit::GetStatByAuraGroup ( UnitMods  unitMod) const
15291{
15292 Stats stat = STAT_STRENGTH;
15293
15294 switch (unitMod)
15295 {
15297 stat = STAT_STRENGTH;
15298 break;
15300 stat = STAT_AGILITY;
15301 break;
15303 stat = STAT_STAMINA;
15304 break;
15306 stat = STAT_INTELLECT;
15307 break;
15309 stat = STAT_SPIRIT;
15310 break;
15311
15312 default:
15313 break;
15314 }
15315
15316 return stat;
15317}
@ UNIT_MOD_STAT_INTELLECT
Definition: Unit.h:146
@ UNIT_MOD_STAT_SPIRIT
Definition: Unit.h:147
@ UNIT_MOD_STAT_STRENGTH
Definition: Unit.h:143
@ UNIT_MOD_STAT_AGILITY
Definition: Unit.h:144
@ UNIT_MOD_STAT_STAMINA
Definition: Unit.h:145
Stats
Definition: SharedDefines.h:257
@ STAT_SPIRIT
Definition: SharedDefines.h:262
@ STAT_INTELLECT
Definition: SharedDefines.h:261
@ STAT_AGILITY
Definition: SharedDefines.h:259
@ STAT_STRENGTH
Definition: SharedDefines.h:258
@ STAT_STAMINA
Definition: SharedDefines.h:260

References STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by HandleStatModifier().

◆ GetTarget()

◆ GetThreatMgr() [1/2]

ThreatMgr & Unit::GetThreatMgr ( )
inline
1487{ return m_ThreatMgr; }

References m_ThreatMgr.

Referenced by CreatureAI::_EnterEvadeMode(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_razorgore::boss_razorgoreAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_jindo::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_nethermancer_sepethrea::CanAIAttack(), boss_mor_grayhoof::CastRandomSpell(), CleanupBeforeRemoveFromMap(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_ysondre::boss_ysondreAI::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), ScriptedAI::DoAddThreat(), UnitAI::DoCastToAllHostilePlayers(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoGetThreat(), ScriptedAI::DoModifyThreatByPercent(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), ScriptedAI::DoResetThreat(), ScriptedAI::DoResetThreatList(), Spell::EffectModifyThreatPercent(), Spell::EffectTaunt(), boss_faction_championsAI::EnemiesInRange(), boss_ragnaros::boss_ragnarosAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), boss_murmur::EnterEvadeMode(), boss_alar::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), boss_ouro::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), TemporaryThreatModifierEvent::Execute(), StartMovementEvent::Execute(), boss_supremus::FindHatefulStrikeTarget(), npc_raging_flames::FixateRandomTarget(), SmartScript::GetTargets(), UnitAI::GetThreatMgr(), debug_commandscript::HandleDebugThreatListCommand(), spell_karazhan_blink::HandleDummy(), spell_kaelthas_mind_control::HandleEffect(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_enveloping_webs::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), HandleProcTriggerSpell(), PetAI::HandleReturnMovement(), spell_pursue::HandleScript(), spell_gurtogg_eject::HandleScriptEffect(), spell_leotheras_whirlwind::HandleScriptEffect(), boss_attumen::IsSummonedBy(), boss_blackheart_the_inciter::JustEngagedWith(), boss_jindo::JustSummoned(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), Creature::ModifyThreatPercentTemp(), boss_bug_trio::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), NonTankTargetSelector::operator()(), StoneGripTargetSelector::operator()(), boss_jeklik::PathEndReached(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), boss_talon_king_ikiss::Reset(), boss_faction_championsAI::SelectEnemyCaster(), npc_scholomance_occultist::npc_scholomance_occultistAI::SelectUnitCasting(), SendChangeCurrentVictimOpcode(), SendThreatListUpdate(), setDeathState(), SetPhaseMask(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), boss_ouro::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), BossAI::TeleportCheaters(), Creature::Update(), Update(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_yazzai::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), boss_taldaram::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), boss_netherspite::UpdatePortals(), and CreatureAI::UpdateVictim().

◆ GetThreatMgr() [2/2]

ThreatMgr const & Unit::GetThreatMgr ( ) const
inline
1488{ return m_ThreatMgr; }

References m_ThreatMgr.

◆ GetTotalAttackPowerValue()

float Unit::GetTotalAttackPowerValue ( WeaponAttackType  attType,
Unit pVictim = nullptr 
) const
15342{
15343 if (attType == RANGED_ATTACK)
15344 {
15346 if( victim )
15347 ap += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
15348
15349 if (ap < 0)
15350 return 0.0f;
15352 }
15353 else
15354 {
15356 if( victim )
15357 ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
15358
15359 if (ap < 0)
15360 return 0.0f;
15362 }
15363}
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition: UpdateFields.h:163
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition: UpdateFields.h:165
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:167
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition: UpdateFields.h:164
@ UNIT_FIELD_ATTACK_POWER
Definition: UpdateFields.h:162
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition: UpdateFields.h:166
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
Definition: SpellAuraDefines.h:190
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
Definition: SpellAuraDefines.h:228
int32 GetInt32Value(uint16 index) const
Definition: Object.cpp:299

References Object::GetFloatValue(), Object::GetInt32Value(), GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, and UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER.

Referenced by spell_dk_ghoul_thrash::CalcDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_execute::HandleEffect(), spell_pal_seal_of_righteousness::HandleProc(), HandleProcTriggerSpell(), Spell::HandleThreatSpells(), Guardian::InitStatsForLevel(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellHealingBonusDone(), Guardian::UpdateDamagePhysical(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTotalAuraModifier()

◆ GetTotalAuraModifierAreaExclusive()

int32 Unit::GetTotalAuraModifierAreaExclusive ( AuraType  auratype) const
5835{
5836 int32 modifier = 0;
5837 int32 areaModifier = 0;
5838
5839 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5840 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5841 {
5842 if ((*i)->GetSpellInfo()->HasAreaAuraEffect())
5843 {
5844 if (areaModifier < (*i)->GetAmount())
5845 areaModifier = (*i)->GetAmount();
5846 }
5847 else
5848 modifier += (*i)->GetAmount();
5849 }
5850
5851 return modifier + areaModifier;
5852}

References GetAuraEffectsByType().

Referenced by Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByAffectMask()

int32 Unit::GetTotalAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6011{
6012 int32 modifier = 0;
6013
6014 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6015 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6016 if ((*i)->IsAffectedOnSpell(affectedSpell))
6017 modifier += (*i)->GetAmount();
6018
6019 return modifier;
6020}

References GetAuraEffectsByType().

◆ GetTotalAuraModifierByMiscMask()

int32 Unit::GetTotalAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
5906{
5907 int32 modifier = 0;
5908
5909 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5910 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5911 {
5912 if ((*i)->GetMiscValue()& misc_mask)
5913 modifier += (*i)->GetAmount();
5914 }
5915 return modifier;
5916}

References GetAuraEffectsByType().

Referenced by CalcArmorReducedDamage(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetEffectiveResistChance(), MagicSpellHitResult(), SpellCriticalDamageBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), and Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByMiscValue()

int32 Unit::GetTotalAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
5959{
5960 int32 modifier = 0;
5961
5962 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5963 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5964 if ((*i)->GetMiscValue() == misc_value)
5965 modifier += (*i)->GetAmount();
5966
5967 return modifier;
5968}

References GetAuraEffectsByType().

Referenced by Player::CalculateReputationGain(), GetMechanicResistChance(), MeleeSpellHitResult(), ModSpellDuration(), Creature::Regenerate(), Player::Regenerate(), RollMeleeOutcomeAgainst(), and Player::UpdateManaRegen().

◆ GetTotalAuraModValue()

float Unit::GetTotalAuraModValue ( UnitMods  unitMod) const
15232{
15233 if (unitMod >= UNIT_MOD_END)
15234 {
15235 LOG_ERROR("entities.unit", "attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
15236 return 0.0f;
15237 }
15238
15239 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15240 return 0.0f;
15241
15242 float value = m_auraModifiersGroup[unitMod][BASE_VALUE];
15243 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15244 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE];
15245 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15246
15247 return value;
15248}

References BASE_PCT, BASE_VALUE, LOG_ERROR, m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_END.

Referenced by Creature::UpdateArmor(), Creature::UpdateMaxHealth(), Creature::UpdateMaxPower(), and Creature::UpdateResistances().

◆ GetTotalAuraMultiplier()

float Unit::GetTotalAuraMultiplier ( AuraType  auratype) const
5869{
5870 float multiplier = 1.0f;
5871
5872 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5873 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5874 AddPct(multiplier, (*i)->GetAmount());
5875
5876 return multiplier;
5877}

References AddPct(), and GetAuraEffectsByType().

Referenced by MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), SpellCriticalHealingBonus(), and UpdateSpeed().

◆ GetTotalAuraMultiplierByAffectMask()

float Unit::GetTotalAuraMultiplierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6023{
6024 float multiplier = 1.0f;
6025
6026 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6027 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6028 if ((*i)->IsAffectedOnSpell(affectedSpell))
6029 AddPct(multiplier, (*i)->GetAmount());
6030
6031 return multiplier;
6032}

References AddPct(), and GetAuraEffectsByType().

◆ GetTotalAuraMultiplierByMiscMask()

float Unit::GetTotalAuraMultiplierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
5919{
5920 float multiplier = 1.0f;
5921
5922 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5923 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5924 if (((*i)->GetMiscValue() & misc_mask))
5925 AddPct(multiplier, (*i)->GetAmount());
5926
5927 return multiplier;
5928}

References AddPct(), and GetAuraEffectsByType().

Referenced by CalculateAOEDamageReduction(), CalculateMeleeDamage(), MeleeDamageBonusTaken(), and SpellCriticalHealingBonus().

◆ GetTotalAuraMultiplierByMiscValue()

float Unit::GetTotalAuraMultiplierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
5971{
5972 float multiplier = 1.0f;
5973
5974 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5975 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5976 if ((*i)->GetMiscValue() == misc_value)
5977 AddPct(multiplier, (*i)->GetAmount());
5978
5979 return multiplier;
5980}

References AddPct(), and GetAuraEffectsByType().

Referenced by Player::UpdateManaRegen().

◆ GetTotalStatValue()

float Unit::GetTotalStatValue ( Stats  stat,
float  additionalValue = 0.0f 
) const
15216{
15217 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_STAT_START) + stat);
15218
15219 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15220 return 0.0f;
15221
15222 // value = ((base_value * base_pct) + total_value) * total_pct
15223 float value = m_auraModifiersGroup[unitMod][BASE_VALUE] + GetCreateStat(stat);
15224 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15225 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE] + additionalValue;
15226 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15227
15228 return value;
15229}
UnitMods
Definition: Unit.h:142
@ UNIT_MOD_STAT_START
Definition: Unit.h:170
float GetCreateStat(Stats stat) const
Definition: Unit.h:1387

References BASE_PCT, BASE_VALUE, GetCreateStat(), m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_STAT_START.

Referenced by Player::UpdateAllStats(), Guardian::UpdateStats(), and Player::UpdateStats().

◆ getTransForm()

◆ GetTransGUID()

◆ GetUnitBlockChance()

float Unit::GetUnitBlockChance ( ) const
3663{
3664 if (Player const* player = ToPlayer())
3665 {
3666 if (player->CanBlock())
3667 {
3668 Item* tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
3669 if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetTemplate()->Block)
3671 }
3672 // is player but has no block ability or no not broken shield equipped
3673 return 0.0f;
3674 }
3675 else
3676 {
3677 if (ToCreature()->IsTotem())
3678 return 0.0f;
3679 else
3680 {
3681 float block = 5.0f;
3683 return block > 0.0f ? block : 0.0f;
3684 }
3685 }
3686}
@ EQUIPMENT_SLOT_OFFHAND
Definition: Player.h:691
#define INVENTORY_SLOT_BAG_0
Definition: Player.h:670
@ PLAYER_BLOCK_PERCENTAGE
Definition: UpdateFields.h:346
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition: SpellAuraDefines.h:114
ItemTemplate const * GetTemplate() const
Definition: Item.cpp:545
bool IsBroken() const
Definition: Item.h:257
uint32 Block
Definition: ItemTemplate.h:682

References ItemTemplate::Block, EQUIPMENT_SLOT_OFFHAND, Object::GetFloatValue(), Item::GetTemplate(), GetTotalAuraModifier(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), IsTotem(), PLAYER_BLOCK_PERCENTAGE, SPELL_AURA_MOD_BLOCK_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitCriticalChance()

float Unit::GetUnitCriticalChance ( WeaponAttackType  attackType,
Unit const *  victim 
) const
3689{
3690 float crit;
3691
3692 if (IsPlayer())
3693 {
3694 switch (attackType)
3695 {
3696 case BASE_ATTACK:
3698 break;
3699 case OFF_ATTACK:
3701 break;
3702 case RANGED_ATTACK:
3704 break;
3705 // Just for good manner
3706 default:
3707 crit = 0.0f;
3708 break;
3709 }
3710 }
3711 else
3712 {
3713 crit = 5.0f;
3716 }
3717
3718 // flat aura mods
3719 if (attackType == RANGED_ATTACK)
3720 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE);
3721 else
3722 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE);
3723
3724 AuraEffectList const& mTotalAuraList = victim->GetAuraEffectsByType(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER);
3725 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
3726 {
3727 if (GetGUID() != (*i)->GetCasterGUID())
3728 continue;
3729
3730 crit += (*i)->GetAmount();
3731 }
3732
3733 // reduce crit chance from Rating for players
3734 if (attackType != RANGED_ATTACK)
3735 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_MELEE);
3736 else
3737 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_RANGED);
3738
3739 // Apply crit chance from defence skill
3740 crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
3741
3742 // xinef: SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE should be calculated at the end
3743 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
3744
3745 if (crit < 0.0f)
3746 crit = 0.0f;
3747 return crit;
3748}
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition: UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition: UpdateFields.h:351
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition: UpdateFields.h:353
@ SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER
Definition: SpellAuraDefines.h:371
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE
Definition: SpellAuraDefines.h:251
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
Definition: SpellAuraDefines.h:260
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE
Definition: SpellAuraDefines.h:250
@ SPELL_AURA_MOD_CRIT_PCT
Definition: SpellAuraDefines.h:353
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition: SpellAuraDefines.h:115
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition: Unit.h:891

References ApplyResilience(), BASE_ATTACK, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, GetAuraEffectsByType(), GetDefenseSkillValue(), Object::GetFloatValue(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), Object::IsPlayer(), OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_MOD_CRIT_PCT, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by spell_dk_wandering_plague_aura::CheckProc(), and RollMeleeOutcomeAgainst().

◆ GetUnitDodgeChance()

float Unit::GetUnitDodgeChance ( ) const
3601{
3602 if (IsPlayer())
3603 return ToPlayer()->GetRealDodge(); //GetFloatValue(PLAYER_DODGE_PERCENTAGE);
3604 else
3605 {
3606 if (ToCreature()->IsTotem())
3607 return 0.0f;
3608 else
3609 {
3610 float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)
3612 return dodge > 0.0f ? dodge : 0.0f;
3613 }
3614 }
3615}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition: SpellAuraDefines.h:112
float GetRealDodge() const
Definition: Player.h:2584

References Player::GetRealDodge(), GetTotalAuraModifier(), Object::IsPlayer(), IsTotem(), Creature::isWorldBoss(), SPELL_AURA_MOD_DODGE_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitFlags()

◆ GetUnitFlags2()

UnitFlags2 Unit::GetUnitFlags2 ( ) const
inline
UnitFlags2
Definition: UnitDefines.h:266
@ UNIT_FIELD_FLAGS_2
Definition: UpdateFields.h:118

References Object::GetUInt32Value(), and UNIT_FIELD_FLAGS_2.

Referenced by npc_commandscript::HandleNpcInfoCommand().

◆ GetUnitMeleeSkill()

uint32 Unit::GetUnitMeleeSkill ( Unit const *  target = nullptr) const
inline
980{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }

References GetLevel(), and getLevelForTarget().

Referenced by DealMeleeDamage(), GetDefenseSkillValue(), and GetWeaponSkillValue().

◆ GetUnitMissChance()

float Unit::GetUnitMissChance ( WeaponAttackType  attType) const
3648{
3649 float miss_chance = 5.00f;
3650
3651 if (Player const* player = ToPlayer())
3652 miss_chance += player->GetMissPercentageFromDefence();
3653
3654 if (attType == RANGED_ATTACK)
3656 else
3658
3659 return miss_chance;
3660}
@ SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE
Definition: SpellAuraDefines.h:247
@ SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
Definition: SpellAuraDefines.h:248

References GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE, and Object::ToPlayer().

Referenced by MeleeSpellMissChance().

◆ GetUnitMovementFlags()

◆ GetUnitParryChance()

float Unit::GetUnitParryChance ( ) const
3618{
3619 float chance = 0.0f;
3620
3621 if (Player const* player = ToPlayer())
3622 {
3623 if (player->CanParry())
3624 {
3625 Item* tmpitem = player->GetWeaponForAttack(BASE_ATTACK, true);
3626 if (!tmpitem)
3627 tmpitem = player->GetWeaponForAttack(OFF_ATTACK, true);
3628
3629 if (tmpitem)
3630 chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE);
3631 }
3632 }
3633 else if (GetTypeId() == TYPEID_UNIT)
3634 {
3635 if (ToCreature()->isWorldBoss())
3636 chance = 13.4f; // + 0.6 by skill diff
3638 chance = 5.0f;
3639
3640 // Xinef: if aura is present, type should not matter
3642 }
3643
3644 return chance > 0.0f ? chance : 0.0f;
3645}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition: SpellAuraDefines.h:110

References BASE_ATTACK, CREATURE_TYPE_HUMANOID, GetCreatureType(), GetTotalAuraModifier(), Object::GetTypeId(), OFF_ATTACK, SPELL_AURA_MOD_PARRY_PERCENT, Object::ToCreature(), Object::ToPlayer(), and TYPEID_UNIT.

Referenced by spell_dk_spell_deflection::Absorb(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitState()

uint32 Unit::GetUnitState ( ) const
inline

◆ GetUnitTypeMask()

uint32 Unit::GetUnitTypeMask ( ) const
inline
749{ return m_unitTypeMask; }

References m_unitTypeMask.

◆ GetVehicle()

Vehicle * Unit::GetVehicle ( ) const
inline
1696{ return m_vehicle; }

References m_vehicle.

Referenced by KillRewarder::_InitXP(), Vehicle::AddPassenger(), WorldSession::BuildPartyMemberStatsChangedPacket(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::CanAIAttack(), npc_raging_spirit::npc_raging_spiritAI::CanAIAttack(), npc_icc_lk_checktarget::npc_icc_lk_checktargetAI::CanAIAttack(), boss_flame_leviathan_defense_turret::boss_flame_leviathan_defense_turretAI::CanAIAttack(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::CheckAchievementCriteriaMeet(), Spell::CheckCast(), Spell::EffectJumpDest(), Spell::EffectKnockBack(), CreatureAI::EnterEvadeMode(), GetDirectTransport(), SmartScript::GetTargets(), GetTransGUID(), WorldSession::HandleAttackSwingOpcode(), WorldSession::HandleChangeSeatsOnControlledVehicle(), spell_switch_infragreen_bomber_station::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), Player::IsPetNeedBeTemporaryUnsummoned(), npc_nexus_lord::npc_nexus_lordAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), achievement_flame_leviathan_garage::OnCheck(), achievement_wg_didnt_stand_a_chance::OnCheck(), npc_announcer_toc5::OnGossipHello(), BattlefieldWG::OnPlayerLeaveWar(), boss_flame_leviathan_overload_device::boss_flame_leviathan_overload_deviceAI::OnSpellClick(), VehicleCheck::operator()(), OutDebugInfo(), Player::ProcessDelayedOperations(), Player::ProcessTerrainStatusUpdate(), Vehicle::RemovePassenger(), Creature::SelectVictim(), SetControlled(), Player::SetViewpoint(), lfg::LFGMgr::TeleportPlayer(), npc_pilgrims_bounty_chair::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_impaling_spear::npc_impaling_spearAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdatePosition(), UpdateSpeed(), GameObject::Use(), Acore::MessageDistDeliverer::Visit(), and Acore::MessageDistDelivererToHostile::Visit().

◆ GetVehicleBase()

◆ GetVehicleCreatureBase()

◆ GetVehicleKit()

Vehicle * Unit::GetVehicleKit ( ) const
inline
1695{ return m_vehicleKit; }

References m_vehicleKit.

Referenced by _EnterVehicle(), Creature::AddToWorld(), Creature::AIM_Initialize(), boss_xt002::boss_xt002AI::AttachHeart(), npc_salvaged_siege_engine::BeforeSpellClick(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::boss_deathbringer_saurfangAI(), spell_igb_cannon_blast::CalculatePower(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::CheckCast(), SmartAI::CheckConditions(), VehicleAI::CheckConditions(), Map::CreatureRelocation(), Dismount(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), npc_ulduar_vx001::npc_ulduar_vx001AI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), Spell::EffectTeleportUnits(), CreatureAI::EnterEvadeMode(), boss_ick::boss_ickAI::GetKrick(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::GetS3(), SmartScript::GetTargets(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraSetVehicle(), WorldSession::HandleCastSpellOpcode(), spell_q13280_13283_plant_battle_standard::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_q12919_gymers_throw::HandleScript(), HandleSpellClick(), IsOnVehicle(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), boss_gormok::boss_gormokAI::JustEngagedWith(), Mount(), npc_hover_disk::npc_hover_diskAI::MovementInform(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::MovementInform(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::MovementInform(), npc_vics_flying_machine::npc_vics_flying_machineAI::MovementInform(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::npc_high_overlord_saurfangAI(), npc_orb_carrier::npc_orb_carrierAI::npc_orb_carrierAI(), spell_systems_shutdown_aura::OnApply(), VehicleAI::OnCharmed(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), FlameLeviathanPursuedTargetSelector::operator()(), OutDebugInfo(), npc_wintergarde_gryphon::PassengerBoarded(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), Map::PlayerRelocation(), SmartScript::ProcessAction(), boss_skadi_grauf::boss_skadi_graufAI::RemoveSkadi(), Spell::SelectImplicitCasterObjectTargets(), SmartAI::SmartAI(), npc_wintergarde_gryphon::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_storm_cloud::npc_storm_cloudAI::SpellHit(), boss_flame_leviathan::boss_flame_leviathanAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::SpreadFire(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_siege_machine::npc_wg_siege_machineAI::UpdateAI(), UpdateHeight(), and UpdateOrientation().

◆ GetVictim()

Unit * Unit::GetVictim ( ) const
inline
726{ return m_attacking; }

References m_attacking.

Referenced by boss_marli::_chargePlayer(), PetAI::_needToStop(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), SmartAI::AssistPlayerInCombatAgainst(), PetAI::AttackedBy(), npc_calvin_montague::npc_calvin_montagueAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), boss_malygos::boss_malygosAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), Object::BuildMovementUpdate(), Creature::CallAssistance(), Creature::CallForHelp(), TurretAI::CanAIAttack(), PetAI::CanAttack(), boss_attumen::CanMeleeHit(), boss_midnight::CanMeleeHit(), boss_swamplord_muselek::CanShootVictim(), Spell::CheckCast(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), boss_skadi::boss_skadiAI::DoAction(), UnitAI::DoCast(), UnitAI::DoCastVictim(), ConfusedMovementGenerator< T >::DoFinalize(), Creature::DoFleeToGetAssistance(), UnitAI::DoMeleeAttackIfReady(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), ScriptedAI::DoStopAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectTaunt(), boss_ouro::Emerge(), boss_halazzi::EnterPhase(), boss_zuljin::boss_zuljinAI::EnterPhase(), RestoreAttack::Execute(), StartMovementEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::ExecuteEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::ExecuteEvent(), emerald_dragonAI::ExecuteEvent(), spell_shazzrah_gate_dummy::FilterTargets(), spell_malchezaar_enfeeble::FilterTargets(), spell_chain_burn::FilterTargets(), spell_morogrim_tidewalker_watery_grave::FilterTargets(), TimedFleeingMovementGenerator::Finalize(), getAttackerForHelper(), ThreatMgr::GetCurrentVictim(), Player::GetInitialVisiblePackets(), CreatureGroup::GetNewTargetForMember(), SmartScript::GetTargets(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), cast_commandscript::HandleCastTargetCommad(), spell_aggro_drones::HandleDummy(), spell_gen_threshalisk_charge::HandleDummy(), HandleDummyAuraProc(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_lurker_below_spout::HandleEffectRemove(), AuraEffect::HandleModPossessPet(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandleSetRaidDifficultyOpcode(), ChaseMovementGenerator< T >::HasLostTarget(), Spell::InitExplicitTargets(), RotateMovementGenerator::Initialize(), IsMutualChase(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_malchezaar_axe::JustEngagedWith(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustEngagedWith(), npc_zealot_zath::JustEngagedWith(), npc_yor::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), npc_thaladred::JustEngagedWith(), boss_nethermancer_sepethrea::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), boss_vem::JustEngagedWith(), boss_veklor::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_midnight::JustSummoned(), boss_nightbane::JustSummoned(), boss_halazzi::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), boss_the_black_stalker::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), npc_emily::npc_emilyAI::JustSummoned(), PetAI::KilledUnit(), boss_ick::boss_ickAI::KilledUnit(), boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), CreatureGroup::MemberEngagingTarget(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_kerlonian::npc_kerlonianAI::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_ringo::npc_ringoAI::MoveInLineOfSight(), boss_gluth::boss_gluthAI::MoveInLineOfSight(), npc_future_you::npc_future_youAI::MoveInLineOfSight(), npc_captain_saeed::npc_captain_saeedAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), boss_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_kagani_nightstrike::MovementInform(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), NecroticPlagueTargetCheck::operator()(), NonTankTargetSelector::operator()(), BoneStormMoveTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), UnboundPlagueTargetSelector::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), boss_nefarian::PathEndReached(), SmartScript::ProcessEvent(), SmartScript::ProcessEventsFor(), SmartScript::ProcessTimedAction(), npc_mograine::npc_mograineAI::PullCathedral(), boss_grobbulus::boss_grobbulusAI::PullChamberAdds(), Creature::ReleaseFocus(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_pet_hunter_snake_trap::Reset(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), npc_giant_claw_tentacle::ScheduleTasks(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), PetAI::SelectNextTarget(), UnitAI::SelectTargetList(), SmartAI::SetCombatMove(), SetConfused(), SetFeared(), SetStunned(), boss_murmur::ShouldCastResonance(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), npc_escortAI::Start(), FollowerAI::StartFollow(), StopAttackFaction(), StopAttackingInvalidTarget(), SummonCroneIfReady(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), boss_dorothee::SummonTito(), TauntApply(), TauntFadeOut(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Pet::Update(), Creature::Update(), Player::Update(), CasterAI::UpdateAI(), ArcherAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_general_angerforge::boss_general_angerforgeAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_broodlord::boss_broodlordAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), boss_ellris_duskhallow::UpdateAI(), boss_eramas_brightblaze::UpdateAI(), boss_yazzai::UpdateAI(), boss_warlord_salaris::UpdateAI(), boss_garaxxas::UpdateAI(), boss_zelfan::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_brutallus::boss_brutallusAI::UpdateAI(), boss_sacrolash::boss_sacrolashAI::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_fenstalker::boss_fenstalkerAI::UpdateAI(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_muglash::npc_muglashAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), npc_crystalline_frayer::npc_crystalline_frayerAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_keleseth::boss_kelesethAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), npc_azure_invader::npc_azure_invaderAI::UpdateAI(), npc_azure_raider::npc_azure_raiderAI::UpdateAI(), npc_azure_captain::npc_azure_captainAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), guard_shattrath_scryer::guard_shattrath_scryerAI::UpdateAI(), guard_shattrath_aldor::guard_shattrath_aldorAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), PossessedAI::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_zuljin_vortex::npc_zuljin_vortexAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), npc_pet_gen_gnomish_flame_turret::UpdateAI(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_akama_illidan::npc_akama_illidanAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), Player::UpdateFFAPvPFlag(), Player::UpdateFFAPvPState(), SmartAI::UpdatePath(), boss_netherspite::UpdatePortals(), CreatureAI::UpdateVictim(), CreatureAI::UpdateVictimWithGaze(), and boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UseAbility().

◆ GetVisibleAura()

AuraApplication * Unit::GetVisibleAura ( uint8  slot)
inline
1495 {
1496 VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
1497 if (itr != m_visibleAuras.end())
1498 return itr->second;
1499 return nullptr;
1500 }

References m_visibleAuras.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), AuraApplication::BuildUpdatePacket(), and WorldSession::HandleRequestPartyMemberStatsOpcode().

◆ GetVisibleAuras()

◆ GetWeaponDamageRange()

float Unit::GetWeaponDamageRange ( WeaponAttackType  attType,
WeaponDamageRange  type,
uint8  damageIndex = 0 
) const
15366{
15367 if (attType == OFF_ATTACK && !haveOffhandWeapon())
15368 return 0.0f;
15369
15370 return m_weaponDamage[attType][type][damageIndex];
15371}

References haveOffhandWeapon(), m_weaponDamage, and OFF_ATTACK.

Referenced by Player::_ApplyWeaponDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and Guardian::UpdateDamagePhysical().

◆ GetWeaponProcChance()

float Unit::GetWeaponProcChance ( ) const
13362{
13363 // normalized proc chance for weapon attack speed
13364 // (odd formula...)
13366 return (GetAttackTime(BASE_ATTACK) * 1.8f / 1000.0f);
13368 return (GetAttackTime(OFF_ATTACK) * 1.6f / 1000.0f);
13369 return 0;
13370}

References BASE_ATTACK, GetAttackTime(), haveOffhandWeapon(), isAttackReady(), and OFF_ATTACK.

Referenced by Player::CastItemCombatSpell().

◆ GetWeaponSkillValue()

uint32 Unit::GetWeaponSkillValue ( WeaponAttackType  attType,
Unit const *  target = nullptr 
) const
3751{
3752 uint32 value = 0;
3753 if (Player const* player = ToPlayer())
3754 {
3755 Item* item = player->GetWeaponForAttack(attType, true);
3756
3757 // feral or unarmed skill only for base attack
3758 if (attType != BASE_ATTACK && !item)
3759 return 0;
3760
3761 if (IsInFeralForm())
3762 return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
3763
3764 // weapon skill or (unarmed for base attack)
3765 uint32 skill = SKILL_UNARMED;
3766 if (item)
3767 skill = item->GetSkill();
3768
3769 // in PvP use full skill instead current skill value
3770 value = (target && target->IsControlledByPlayer())
3771 ? player->GetMaxSkillValue(skill)
3772 : player->GetSkillValue(skill);
3773 // Modify value from ratings
3774 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
3775 switch (attType)
3776 {
3777 case BASE_ATTACK:
3778 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND));
3779 break;
3780 case OFF_ATTACK:
3781 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND));
3782 break;
3783 case RANGED_ATTACK:
3784 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED));
3785 break;
3786 default:
3787 break;
3788 }
3789 }
3790 else
3791 value = GetUnitMeleeSkill(target);
3792 return value;
3793}
@ CR_WEAPON_SKILL_RANGED
Definition: Unit.h:239
@ CR_WEAPON_SKILL
Definition: Unit.h:217
@ CR_WEAPON_SKILL_OFFHAND
Definition: Unit.h:238
@ CR_WEAPON_SKILL_MAINHAND
Definition: Unit.h:237
@ SKILL_UNARMED
Definition: SharedDefines.h:2907
uint32 GetSkill()
Definition: Item.cpp:556
bool IsInFeralForm() const
Definition: Unit.h:1419

References BASE_ATTACK, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, GetMaxSkillValueForLevel(), Item::GetSkill(), GetUnitMeleeSkill(), IsControlledByPlayer(), IsInFeralForm(), OFF_ATTACK, RANGED_ATTACK, SKILL_UNARMED, and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), and Player::UpdateCritPercentage().

◆ HandleAuraProc()

bool Unit::HandleAuraProc ( Unit victim,
uint32  damage,
Aura triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
bool *  handled 
)
private
8675{
8676 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
8677
8678 switch (dummySpell->SpellFamilyName)
8679 {
8681 switch (dummySpell->Id)
8682 {
8683 // Nevermelting Ice Crystal
8684 case 71564:
8685 RemoveAuraFromStack(71564);
8686 *handled = true;
8687 break;
8688 // Gaseous Bloat
8689 case 70672:
8690 case 72455:
8691 case 72832:
8692 case 72833:
8693 {
8694 if (Unit* caster = triggeredByAura->GetCaster())
8695 if (victim && caster->GetGUID() == victim->GetGUID())
8696 {
8697 *handled = true;
8698 uint32 stack = triggeredByAura->GetStackAmount();
8699 int32 const mod = (GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
8700 int32 dmg = 0;
8701 for (uint8 i = 1; i <= stack; ++i)
8702 dmg += mod * i;
8703 caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg);
8704 }
8705 break;
8706 }
8707 // Ball of Flames Proc
8708 case 71756:
8709 case 72782:
8710 case 72783:
8711 case 72784:
8712 RemoveAuraFromStack(dummySpell->Id);
8713 *handled = true;
8714 break;
8715 // Discerning Eye of the Beast
8716 case 59915:
8717 {
8718 CastSpell(this, 59914, true); // 59914 already has correct basepoints in DBC, no need for custom bp
8719 *handled = true;
8720 break;
8721 }
8722 // Swift Hand of Justice
8723 case 59906:
8724 {
8725 int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue());
8726 CastCustomSpell(this, 59913, &bp0, nullptr, nullptr, true);
8727 *handled = true;
8728 break;
8729 }
8730 }
8731
8732 break;
8733 case SPELLFAMILY_MAGE:
8734 {
8735 // Combustion
8736 switch (dummySpell->Id)
8737 {
8738 case 11129:
8739 {
8740 *handled = true;
8741 Unit* caster = triggeredByAura->GetCaster();
8742 if (!caster || !damage)
8743 return false;
8744
8745 // last charge and crit
8746 if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT))
8747 return true; // charge counting (will removed)
8748
8749 CastSpell(this, 28682, true);
8750
8751 return procEx & PROC_EX_CRITICAL_HIT;
8752 }
8753 // Empowered Fire
8754 case 31656:
8755 case 31657:
8756 case 31658:
8757 {
8758 *handled = true;
8759
8760 SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545);
8761 if (!spInfo)
8762 return false;
8763
8764 int32 bp0 = int32(CalculatePct(GetMaxPower(POWER_MANA), spInfo->Effects[0].CalcValue()));
8765 CastCustomSpell(this, 67545, &bp0, nullptr, nullptr, true, nullptr, triggeredByAura->GetEffect(EFFECT_0), GetGUID());
8766 return true;
8767 }
8768 }
8769 break;
8770 }
8772 {
8773 // Blood of the North
8774 // Reaping
8775 // Death Rune Mastery
8776 // xinef: Icon 22 is used for item bonus, skip
8777 if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
8778 {
8779 *handled = true;
8780 // Convert recently used Blood Rune to Death Rune
8781 if (Player* player = ToPlayer())
8782 {
8783 if (!player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
8784 return false;
8785
8786 // xinef: not true
8787 //RuneType rune = ToPlayer()->GetLastUsedRune();
8788 // can't proc from death rune use
8789 //if (rune == RUNE_DEATH)
8790 // return false;
8791 AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0);
8792 if (!aurEff)
8793 return false;
8794
8795 // Reset amplitude - set death rune remove timer to 30s
8796 aurEff->ResetPeriodic(true);
8797 uint32 runesLeft;
8798
8799 if (dummySpell->SpellIconID == 2622)
8800 runesLeft = 2;
8801 else
8802 runesLeft = 1;
8803
8804 for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i)
8805 {
8806 if (dummySpell->SpellIconID == 2622)
8807 {
8808 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8809 player->GetBaseRune(i) == RUNE_BLOOD)
8810 continue;
8811 }
8812 else
8813 {
8814 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8815 player->GetBaseRune(i) != RUNE_BLOOD)
8816 continue;
8817 }
8818 if (player->GetRuneCooldown(i) != player->GetRuneBaseCooldown(i, false))
8819 continue;
8820
8821 --runesLeft;
8822 // Mark aura as used
8823 player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff);
8824 }
8825 return true;
8826 }
8827 return false;
8828 }
8829 break;
8830 }
8832 {
8833 switch (dummySpell->Id)
8834 {
8835 // Item - Warrior T10 Protection 4P Bonus
8836 case 70844:
8837 {
8838 int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue());
8839 CastCustomSpell(this, 70845, &basepoints0, nullptr, nullptr, true);
8840 break;
8841 }
8842 default:
8843 break;
8844 }
8845 break;
8846 }
8847 case SPELLFAMILY_SHAMAN:
8848 {
8849 // Flurry
8850 if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
8851 {
8852 if (cooldown)
8853 {
8854 if (HasSpellCooldown(dummySpell->Id))
8855 {
8856 *handled = true;
8857 break;
8858 }
8859
8860 AddSpellCooldown(dummySpell->Id, 0, cooldown);
8861 }
8862 }
8863 break;
8864 }
8865 }
8866 return false;
8867}
@ RUNE_DEATH
Definition: Player.h:412
@ RUNE_BLOOD
Definition: Player.h:409
@ EFFECT_1
Definition: SharedDefines.h:32
@ EFFECT_0
Definition: SharedDefines.h:31
@ SPELLFAMILY_MAGE
Definition: SharedDefines.h:3531
@ SPELLFAMILY_GENERIC
Definition: SharedDefines.h:3528
@ SPELLFAMILY_WARRIOR
Definition: SharedDefines.h:3532
@ SPELLFAMILY_SHAMAN
Definition: SharedDefines.h:3539
@ SPELLFAMILY_DEATHKNIGHT
Definition: SharedDefines.h:3543
virtual bool HasSpellCooldown(uint32) const
Definition: Unit.h:1760
virtual void AddSpellCooldown(uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition: Unit.h:1762
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4880
uint8 GetSpawnMode() const
Definition: Map.h:420
void ResetPeriodic(bool resetPeriodicTimer=false)
Definition: SpellAuraEffects.h:89
AuraEffect * GetEffect(uint8 effIndex) const
Definition: SpellAuras.h:175

References AddSpellCooldown(), CalculatePct(), CastCustomSpell(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, EFFECT_0, EFFECT_1, SpellInfo::Effects, Aura::GetCaster(), Aura::GetCharges(), Aura::GetEffect(), Object::GetGUID(), WorldObject::GetMap(), GetMaxHealth(), GetMaxPower(), Map::GetSpawnMode(), Aura::GetSpellInfo(), Aura::GetStackAmount(), HasSpellCooldown(), SpellInfo::Id, MAX_RUNES, POWER_MANA, PROC_EX_CRITICAL_HIT, RemoveAuraFromStack(), AuraEffect::ResetPeriodic(), RUNE_BLOOD, RUNE_DEATH, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_GENERIC, SPELLFAMILY_MAGE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromCharge()

bool Unit::HandleAuraRaidProcFromCharge ( AuraEffect triggeredByAura)
private
17555{
17556 // aura can be deleted at casts
17557 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17558
17559 uint32 damageSpellId;
17560 switch (spellProto->Id)
17561 {
17562 case 57949: // shiver
17563 damageSpellId = 57952;
17564 //animationSpellId = 57951; dummy effects for jump spell have unknown use (see also 41637)
17565 break;
17566 case 59978: // shiver
17567 damageSpellId = 59979;
17568 break;
17569 case 43593: // Cold Stare
17570 damageSpellId = 43594;
17571 break;
17572 default:
17573 LOG_ERROR("entities.unit", "Unit::HandleAuraRaidProcFromCharge, received unhandled spell: {}", spellProto->Id);
17574 return false;
17575 }
17576
17577 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17578
17579 // jumps
17580 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17581
17582 // current aura expire
17583 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17584
17585 // next target selection
17586 if (jumps > 0)
17587 {
17588 if (Unit* caster = triggeredByAura->GetCaster())
17589 {
17590 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17591 if (Unit* target = GetNextRandomRaidMemberOrPet(radius))
17592 {
17593 CastSpell(target, spellProto, true, nullptr, triggeredByAura, caster_guid);
17594 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17595 aura->SetCharges(jumps);
17596 }
17597 }
17598 }
17599
17600 CastSpell(this, damageSpellId, true, nullptr, triggeredByAura, caster_guid);
17601
17602 return true;
17603}
Unit * GetNextRandomRaidMemberOrPet(float radius)
Definition: Unit.cpp:11035
void SetCharges(uint8 charges)
Definition: SpellAuras.cpp:952

References CastSpell(), SpellInfo::Effects, AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), GetNextRandomRaidMemberOrPet(), AuraEffect::GetSpellInfo(), SpellInfo::Id, LOG_ERROR, and Aura::SetCharges().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromChargeWithValue()

bool Unit::HandleAuraRaidProcFromChargeWithValue ( AuraEffect triggeredByAura)
private
17466{
17467 // aura can be deleted at casts
17468 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17469 int32 heal = triggeredByAura->GetAmount();
17470 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17471
17472 // Currently only Prayer of Mending
17473 if (!(spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
17474 {
17475 LOG_DEBUG("spells.aura", "Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: {}", spellProto->Id);
17476 return false;
17477 }
17478
17479 // jumps
17480 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17481
17482 // current aura expire
17483 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17484
17485 // next target selection
17486 if (jumps > 0)
17487 {
17488 if (Unit* caster = triggeredByAura->GetCaster())
17489 {
17490 // smart healing
17491 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17492 std::list<Unit*> nearMembers;
17493
17494 Player* player = nullptr;
17495 if (IsPlayer())
17496 player = ToPlayer();
17497 else if (GetOwner())
17498 player = GetOwner()->ToPlayer();
17499
17500 if (player)
17501 {
17502 Group* group = player->GetGroup();
17503 if (!group)
17504 {
17505 if (player != this)
17506 {
17507 if (IsWithinDistInMap(player, radius))
17508 nearMembers.push_back(player);
17509 }
17510 else if (Unit* pet = GetGuardianPet())
17511 {
17512 if (IsWithinDistInMap(pet, radius))
17513 nearMembers.push_back(pet);
17514 }
17515 }
17516 else
17517 {
17518 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
17519 if (Player* Target = itr->GetSource())
17520 {
17521 if (Target != this && !IsWithinDistInMap(Target, radius))
17522 continue;
17523
17524 // IsHostileTo check duel and controlled by enemy
17525 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
17526 nearMembers.push_back(Target);
17527
17528 // Push player's pet to vector
17529 if (Unit* pet = Target->GetGuardianPet())
17530 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
17531 nearMembers.push_back(pet);
17532 }
17533 }
17534
17535 if (!nearMembers.empty())
17536 {
17537 nearMembers.sort(Acore::HealthPctOrderPred());
17538 if (Unit* target = nearMembers.front())
17539 {
17540 CastSpell(target, 41637 /*Dummy visual effect triggered by main spell cast*/, true);
17541 CastCustomSpell(target, spellProto->Id, &heal, nullptr, nullptr, true, nullptr, triggeredByAura, caster_guid);
17542 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17543 aura->SetCharges(jumps);
17544 }
17545 }
17546 }
17547 }
17548 }
17549
17550 // heal
17551 CastCustomSpell(this, 33110, &heal, nullptr, nullptr, true, nullptr, nullptr, caster_guid);
17552 return true;
17553}
@ SPELLFAMILY_PRIEST
Definition: SharedDefines.h:3534
Definition: Unit.h:1980

References CastCustomSpell(), CastSpell(), SpellInfo::Effects, AuraEffect::GetAmount(), AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), GetOwner(), AuraEffect::GetSpellInfo(), SpellInfo::Id, IsHostileTo(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, GroupReference::next(), Aura::SetCharges(), SPELLFAMILY_PRIEST, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleDummyAuraProc()

bool Unit::HandleDummyAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
ProcEventInfo const &  eventInfo 
)
private
Todo:
: It should be moved to database, shouldn't it?
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
Todo:
: need more info (cooldowns/PPM)
6534{
6535 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
6536 uint32 effIndex = triggeredByAura->GetEffIndex();
6537 int32 triggerAmount = triggeredByAura->GetAmount();
6538 Spell const* spellProc = eventInfo.GetProcSpell();
6539
6540 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
6541 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
6542
6543 uint32 triggered_spell_id = 0;
6544 uint32 cooldown_spell_id = 0; // for random trigger, will be one of the triggered spell to avoid repeatable triggers
6545 // otherwise, it's the triggered_spell_id by default
6546 Unit* target = victim;
6547 int32 basepoints0 = 0;
6548 ObjectGuid originalCaster;
6549
6550 switch (dummySpell->SpellFamilyName)
6551 {
6553 {
6554 switch (dummySpell->Id)
6555 {
6556 // Overkill
6557 case 58426:
6558 {
6559 triggered_spell_id = 58427;
6560 break;
6561 }
6562 // Unstable Power
6563 case 24658:
6564 {
6565 if (!procSpell || procSpell->Id == 24659)
6566 return false;
6567 // Need remove one 24659 aura
6568 RemoveAuraFromStack(24659);
6569 return true;
6570 }
6571 // Restless Strength
6572 case 24661:
6573 {
6574 // Need remove one 24662 aura
6575 RemoveAuraFromStack(24662);
6576 return true;
6577 }
6578 // Mark of Malice
6579 case 33493:
6580 {
6581 if (triggeredByAura->GetBase()->GetCharges() > 1)
6582 return true;
6583
6584 target = this;
6585 triggered_spell_id = 33494;
6586 break;
6587 }
6588 // Twisted Reflection (boss spell)
6589 case 21063:
6590 triggered_spell_id = 21064;
6591 break;
6592 // Vampiric Aura (boss spell)
6593 case 38196:
6594 {
6595 basepoints0 = 3 * damage; // 300%
6596 if (basepoints0 < 0)
6597 return false;
6598
6599 triggered_spell_id = 31285;
6600 target = this;
6601 break;
6602 }
6603 // Aura of Madness (Darkmoon Card: Madness trinket)
6604 //=====================================================
6605 // 39511 Sociopath: +35 strength (Paladin, Rogue, Druid, Warrior)
6606 // 40997 Delusional: +70 attack power (Rogue, Hunter, Paladin, Warrior, Druid)
6607 // 40998 Kleptomania: +35 agility (Warrior, Rogue, Paladin, Hunter, Druid)
6608 // 40999 Megalomania: +41 damage/healing (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6609 // 41002 Paranoia: +35 spell/melee/ranged crit strike rating (All classes)
6610 // 41005 Manic: +35 haste (spell, melee and ranged) (All classes)
6611 // 41009 Narcissism: +35 intellect (Druid, Shaman, Priest, Warlock, Mage, Paladin, Hunter)
6612 // 41011 Martyr Complex: +35 stamina (All classes)
6613 // 41406 Dementia: Every 5 seconds either gives you +5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6614 // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6615 case 39446:
6616 {
6617 if (GetTypeId() != TYPEID_PLAYER || !IsAlive())
6618 return false;
6619
6620 // Select class defined buff
6621 switch (getClass())
6622 {
6623 case CLASS_PALADIN: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6624 case CLASS_DRUID: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6625 triggered_spell_id = RAND(39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409);
6626 cooldown_spell_id = 39511;
6627 break;
6628 case CLASS_ROGUE: // 39511, 40997, 40998, 41002, 41005, 41011
6629 case CLASS_WARRIOR: // 39511, 40997, 40998, 41002, 41005, 41011
6630 case CLASS_DEATH_KNIGHT:
6631 triggered_spell_id = RAND(39511, 40997, 40998, 41002, 41005, 41011);
6632 cooldown_spell_id = 39511;
6633 break;
6634 case CLASS_PRIEST: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6635 case CLASS_SHAMAN: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6636 case CLASS_MAGE: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6637 case CLASS_WARLOCK: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6638 triggered_spell_id = RAND(40999, 41002, 41005, 41009, 41011, 41406, 41409);
6639 cooldown_spell_id = 40999;
6640 break;
6641 case CLASS_HUNTER: // 40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409
6642 triggered_spell_id = RAND(40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409);
6643 cooldown_spell_id = 40997;
6644 break;
6645 default:
6646 return false;
6647 }
6648
6649 target = this;
6650 if (roll_chance_i(10))
6651 ToPlayer()->Say("This is Madness!", LANG_UNIVERSAL);
6652 break;
6653 }
6654 // Sunwell Exalted Caster Neck (??? neck)
6655 // cast ??? Light's Wrath if Exalted by Aldor
6656 // cast ??? Arcane Bolt if Exalted by Scryers
6657 case 46569:
6658 return false; // old unused version
6659 // Sunwell Exalted Caster Neck (Shattered Sun Pendant of Acumen neck)
6660 // cast 45479 Light's Wrath if Exalted by Aldor
6661 // cast 45429 Arcane Bolt if Exalted by Scryers
6662 case 45481:
6663 {
6664 Player* player = ToPlayer();
6665 if (!player)
6666 return false;
6667
6668 // Get Aldor reputation rank
6669 if (player->GetReputationRank(932) == REP_EXALTED)
6670 {
6671 target = this;
6672 triggered_spell_id = 45479;
6673 break;
6674 }
6675 // Get Scryers reputation rank
6676 if (player->GetReputationRank(934) == REP_EXALTED)
6677 {
6678 // triggered at positive/self casts also, current attack target used then
6679 if (target && IsFriendlyTo(target))
6680 {
6681 target = GetVictim();
6682 if (!target)
6683 {
6684 target = player->GetSelectedUnit();
6685 if (!target)
6686 return false;
6687 }
6688 if (IsFriendlyTo(target))
6689 return false;
6690 }
6691
6692 triggered_spell_id = 45429;
6693 break;
6694 }
6695 return false;
6696 }
6697 // Sunwell Exalted Melee Neck (Shattered Sun Pendant of Might neck)
6698 // cast 45480 Light's Strength if Exalted by Aldor
6699 // cast 45428 Arcane Strike if Exalted by Scryers
6700 case 45482:
6701 {
6702 if (GetTypeId() != TYPEID_PLAYER)
6703 return false;
6704
6705 // Get Aldor reputation rank
6706 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6707 {
6708 target = this;
6709 triggered_spell_id = 45480;
6710 break;
6711 }
6712 // Get Scryers reputation rank
6713 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6714 {
6715 triggered_spell_id = 45428;
6716 break;
6717 }
6718 return false;
6719 }
6720 // Sunwell Exalted Tank Neck (Shattered Sun Pendant of Resolve neck)
6721 // cast 45431 Arcane Insight if Exalted by Aldor
6722 // cast 45432 Light's Ward if Exalted by Scryers
6723 case 45483:
6724 {
6725 if (GetTypeId() != TYPEID_PLAYER)
6726 return false;
6727
6728 // Get Aldor reputation rank
6729 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6730 {
6731 target = this;
6732 triggered_spell_id = 45432;
6733 break;
6734 }
6735 // Get Scryers reputation rank
6736 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6737 {
6738 target = this;
6739 triggered_spell_id = 45431;
6740 break;
6741 }
6742 return false;
6743 }
6744 // Sunwell Exalted Healer Neck (Shattered Sun Pendant of Restoration neck)
6745 // cast 45478 Light's Salvation if Exalted by Aldor
6746 // cast 45430 Arcane Surge if Exalted by Scryers
6747 case 45484:
6748 {
6749 if (GetTypeId() != TYPEID_PLAYER)
6750 return false;
6751
6752 // Get Aldor reputation rank
6753 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6754 {
6755 target = this;
6756 triggered_spell_id = 45478;
6757 break;
6758 }
6759 // Get Scryers reputation rank
6760 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6761 {
6762 triggered_spell_id = 45430;
6763 break;
6764 }
6765 return false;
6766 }
6767 // Kill command
6768 case 58914:
6769 {
6770 // Remove aura stack from pet
6771 RemoveAuraFromStack(58914);
6772 Unit* owner = GetOwner();
6773 if (!owner)
6774 return true;
6775 // reduce the owner's aura stack
6776 owner->RemoveAuraFromStack(34027);
6777 return true;
6778 }
6779 // Vampiric Touch (generic, used by some boss)
6780 case 52723:
6781 case 60501:
6782 {
6783 triggered_spell_id = 52724;
6784 basepoints0 = damage / 2;
6785 target = this;
6786 break;
6787 }
6788 // Divine purpose
6789 case 31871:
6790 case 31872:
6791 {
6792 // Roll chane
6793 if (!victim || !victim->IsAlive() || !roll_chance_i(triggerAmount))
6794 return false;
6795
6796 // Remove any stun effect on target
6798 return true;
6799 }
6800 // Glyph of Life Tap
6801 case 63320:
6802 {
6803 triggered_spell_id = 63321; // Life Tap
6804 break;
6805 }
6806 case 71519: // Deathbringer's Will Normal
6807 {
6808 if (GetTypeId() != TYPEID_PLAYER || HasSpellCooldown(71484))
6809 return false;
6810
6811 AddSpellCooldown(71484, 0, cooldown);
6812
6813 std::vector<uint32> RandomSpells;
6814 switch (getClass())
6815 {
6816 case CLASS_WARRIOR:
6817 case CLASS_PALADIN:
6818 case CLASS_DEATH_KNIGHT:
6819 RandomSpells.push_back(71484);
6820 RandomSpells.push_back(71491);
6821 RandomSpells.push_back(71492);
6822 break;
6823 case CLASS_SHAMAN:
6824 case CLASS_ROGUE:
6825 RandomSpells.push_back(71486);
6826 RandomSpells.push_back(71485);
6827 RandomSpells.push_back(71492);
6828 break;
6829 case CLASS_DRUID:
6830 RandomSpells.push_back(71484);
6831 RandomSpells.push_back(71485);
6832 RandomSpells.push_back(71492);
6833 break;
6834 case CLASS_HUNTER:
6835 RandomSpells.push_back(71486);
6836 RandomSpells.push_back(71491);
6837 RandomSpells.push_back(71485);
6838 break;
6839 default:
6840 return false;
6841 }
6842 if (RandomSpells.empty()) // shouldn't happen
6843 return false;
6844
6845 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
6846 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
6847 break;
6848 }
6849 case 71562: // Deathbringer's Will Heroic
6850 {
6851 if (GetTypeId() != TYPEID_PLAYER || HasSpellCooldown(71561))
6852 return false;
6853
6854 AddSpellCooldown(71561, 0, cooldown);
6855
6856 std::vector<uint32> RandomSpells;
6857 switch (getClass())
6858 {
6859 case CLASS_WARRIOR:
6860 case CLASS_PALADIN:
6861 case CLASS_DEATH_KNIGHT:
6862 RandomSpells.push_back(71561);
6863 RandomSpells.push_back(71559);
6864 RandomSpells.push_back(71560);
6865 break;
6866 case CLASS_SHAMAN:
6867 case CLASS_ROGUE:
6868 RandomSpells.push_back(71558);
6869 RandomSpells.push_back(71556);
6870 RandomSpells.push_back(71560);
6871 break;
6872 case CLASS_DRUID:
6873 RandomSpells.push_back(71561);
6874 RandomSpells.push_back(71556);
6875 RandomSpells.push_back(71560);
6876 break;
6877 case CLASS_HUNTER:
6878 RandomSpells.push_back(71558);
6879 RandomSpells.push_back(71559);
6880 RandomSpells.push_back(71556);
6881 break;
6882 default:
6883 return false;
6884 }
6885 if (RandomSpells.empty()) // shouldn't happen
6886 return false;
6887
6888 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
6889 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
6890 break;
6891 }
6892 // Freya, Petrified Bark
6893 case 62933:
6894 case 62337:
6895 {
6896 if (!victim)
6897 return false;
6898
6899 int32 dmg = damage;
6900 victim->CastCustomSpell(this, 62379, &dmg, 0, 0, true);
6901 return true;
6902 }
6903 // Trial of the Champion, Earth Shield
6904 case 67534:
6905 {
6906 const int32 dmg = (int32)damage;
6907 CastCustomSpell(this, 67535, &dmg, nullptr, nullptr, true, 0, triggeredByAura, triggeredByAura->GetCasterGUID());
6908 return true;
6909 }
6910 // Trial of the Crusader, Faction Champions, Retaliation
6911 case 65932:
6912 {
6913 // check attack comes not from behind
6914 if (!victim || !HasInArc(M_PI, victim))
6915 return false;
6916
6917 triggered_spell_id = 65934;
6918 break;
6919 }
6920 // Pit of Saron, Tyrannus, Overlord's Brand
6921 case 69172: // everything except for DoTs
6922 {
6923 if (!target)
6924 return false;
6925 if (Unit* caster = triggeredByAura->GetCaster())
6926 {
6928 {
6929 int32 dmg = 5.5f * damage;
6930 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
6931 }
6932 else
6933 {
6934 if (caster->GetVictim())
6935 {
6936 int32 dmg = damage;
6937 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
6938 }
6939 }
6940 }
6941 return true;
6942 }
6943 // Pit of Saron, Tyrannus, Overlord's Brand
6944 case 69173: // only DoTs
6945 {
6946 if (!target)
6947 return false;
6948 if (Unit* caster = triggeredByAura->GetCaster())
6949 {
6950 if (procEx & PROC_EX_INTERNAL_HOT)
6951 {
6952 int32 dmg = 5.5f * damage;
6953 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
6954 }
6955 else
6956 {
6957 if (caster->GetVictim())
6958 {
6959 int32 dmg = damage;
6960 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
6961 }
6962 }
6963 }
6964 return true;
6965 }
6966 // Icecrown Citadel, Lady Deathwhisper, Vampiric Might
6967 case 70674:
6968 {
6969 if (Unit* caster = triggeredByAura->GetCaster())
6970 {
6971 int32 dmg = 3 * damage;
6972 caster->CastCustomSpell(caster, 70677, &dmg, 0, 0, true);
6973 }
6974 return true;
6975 }
6976 // Item: Purified Shard of the Gods
6977 case 69755:
6978 {
6979 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69733 : 69729);
6980 break;
6981 }
6982 // Item: Shiny Shard of the Gods
6983 case 69739:
6984 {
6985 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69734 : 69730);
6986 break;
6987 }
6988 // VoA: Meteor Fists koralon
6989 case 66725:
6990 case 68161:
6991 {
6992 triggered_spell_id = 66765; // handled by spell_difficulty
6993 break;
6994 }
6995 }
6996 break;
6997 }
6998 case SPELLFAMILY_MAGE:
6999 {
7000 // Magic Absorption
7001 if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
7002 {
7004 return false;
7005
7006 // mana reward
7007 basepoints0 = CalculatePct(int32(GetMaxPower(POWER_MANA)), triggerAmount);
7008 target = this;
7009 triggered_spell_id = 29442;
7010 break;
7011 }
7012 // Hot Streak
7013 if (dummySpell->SpellIconID == 2999)
7014 {
7015 if (effIndex != 0)
7016 return false;
7017 AuraEffect* counter = triggeredByAura->GetBase()->GetEffect(EFFECT_1);
7018 if (!counter)
7019 return true;
7020
7021 // Count spell criticals in a row in second aura
7022 if (procEx & PROC_EX_CRITICAL_HIT)
7023 {
7024 counter->SetAmount(counter->GetAmount() * 2);
7025 if (counter->GetAmount() < 100) // not enough
7026 return true;
7027 // Crititcal counted -> roll chance
7028 if (roll_chance_i(triggerAmount))
7029 CastSpell(this, 48108, true, castItem, triggeredByAura);
7030 }
7031 counter->SetAmount(25);
7032 return true;
7033 }
7034 // Incanter's Regalia set (add trigger chance to Mana Shield)
7035 if (dummySpell->SpellFamilyFlags[0] & 0x8000)
7036 {
7037 if (GetTypeId() != TYPEID_PLAYER)
7038 return false;
7039
7040 target = this;
7041 triggered_spell_id = 37436;
7042 break;
7043 }
7044 switch (dummySpell->Id)
7045 {
7046 // Glyph of Polymorph
7047 case 56375:
7048 {
7049 if (!target)
7050 return false;
7051 target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed.
7054 return true;
7055 }
7056 // Glyph of Icy Veins
7057 case 56374:
7058 {
7061 return true;
7062 }
7063 // Glyph of Ice Block
7064 case 56372:
7065 {
7066 Player* player = ToPlayer();
7067 if (!player)
7068 return false;
7069
7070 SpellCooldowns const cooldowns = player->GetSpellCooldowns();
7071 // remove cooldowns on all ranks of Frost Nova
7072 for (SpellCooldowns::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
7073 {
7074 SpellInfo const* cdSpell = sSpellMgr->GetSpellInfo(itr->first);
7075 // Frost Nova
7076 if (cdSpell && cdSpell->SpellFamilyName == SPELLFAMILY_MAGE
7077 && cdSpell->SpellFamilyFlags[0] & 0x00000040)
7078 player->RemoveSpellCooldown(cdSpell->Id, true);
7079 }
7080 break;
7081 }
7082 }
7083 break;
7084 }
7086 {
7087 switch (dummySpell->Id)
7088 {
7089 // Victorious
7090 case 32216:
7091 {
7092 RemoveAura(dummySpell->Id);
7093 return false;
7094 }
7095 }
7096
7097 // Second Wind
7098 if (dummySpell->SpellIconID == 1697)
7099 {
7100 // only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
7101 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
7102 return false;
7103 // Need stun or root mechanic
7104 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
7105 return false;
7106
7107 switch (dummySpell->Id)
7108 {
7109 case 29838:
7110 triggered_spell_id = 29842;
7111 break;
7112 case 29834:
7113 triggered_spell_id = 29841;
7114 break;
7115 case 42770:
7116 triggered_spell_id = 42771;
7117 break;
7118 default:
7119 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled spell id: {} (SW)", dummySpell->Id);
7120 return false;
7121 }
7122
7123 target = this;
7124 break;
7125 }
7126 break;
7127 }
7129 {
7130 switch (dummySpell->Id)
7131 {
7132 // Nightfall
7133 case 18094:
7134 case 18095:
7135 // Glyph of corruption
7136 case 56218:
7137 {
7138 target = this;
7139 triggered_spell_id = 17941;
7140 break;
7141 }
7142 // Soul Leech
7143 case 30293:
7144 case 30295:
7145 case 30296:
7146 {
7147 // Improved Soul Leech
7148 AuraEffectList const& SoulLeechAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
7149 for (Unit::AuraEffectList::const_iterator i = SoulLeechAuras.begin(); i != SoulLeechAuras.end(); ++i)
7150 {
7151 if ((*i)->GetId() == 54117 || (*i)->GetId() == 54118)
7152 {
7153 if ((*i)->GetEffIndex() != 0)
7154 continue;
7155 basepoints0 = int32((*i)->GetAmount());
7156 target = GetGuardianPet();
7157 if (target)
7158 {
7159 // regen mana for pet
7160 CastCustomSpell(target, 54607, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7161 }
7162 // regen mana for caster
7163 CastCustomSpell(this, 59117, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7164 // Get second aura of spell for replenishment effect on party
7165 if (AuraEffect const* aurEff = (*i)->GetBase()->GetEffect(EFFECT_1))
7166 {
7167 // Replenishment - roll chance
7168 if (roll_chance_i(aurEff->GetAmount()))
7169 {
7170 CastSpell(this, 57669, true, castItem, triggeredByAura);
7171 }
7172 }
7173 break;
7174 }
7175 }
7176 // health
7177 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7178 target = this;
7179 triggered_spell_id = 30294;
7180 break;
7181 }
7182 // Shadowflame (Voidheart Raiment set bonus)
7183 case 37377:
7184 {
7185 triggered_spell_id = 37379;
7186 break;
7187 }
7188 // Pet Healing (Corruptor Raiment or Rift Stalker Armor)
7189 case 37381:
7190 {
7191 target = GetGuardianPet();
7192 if (!target)
7193 return false;
7194
7195 // heal amount
7196 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7197 triggered_spell_id = 37382;
7198 break;
7199 }
7200 // Shadowflame Hellfire (Voidheart Raiment set bonus)
7201 case 39437:
7202 {
7203 triggered_spell_id = 37378;
7204 break;
7205 }
7206 }
7207 break;
7208 }
7209 case SPELLFAMILY_PRIEST:
7210 {
7211 // Body and Soul
7212 if (dummySpell->SpellIconID == 2218)
7213 {
7214 // Proc only from Abolish desease on self cast
7215 if (procSpell->Id != 552 || victim != this || !roll_chance_i(triggerAmount))
7216 return false;
7217 triggered_spell_id = 64136;
7218 target = this;
7219 break;
7220 }
7221 switch (dummySpell->Id)
7222 {
7223 // Vampiric Embrace
7224 case 15286:
7225 {
7226 if (!victim || !victim->IsAlive() || procSpell->SpellFamilyFlags[1] & 0x80000)
7227 return false;
7228
7229 // heal amount
7230 int32 total = CalculatePct(int32(damage), triggerAmount);
7231 int32 team = total / 5;
7232 int32 self = total - team;
7233 CastCustomSpell(this, 15290, &team, &self, nullptr, true, castItem, triggeredByAura);
7234 return true; // no hidden cooldown
7235 }
7236 // Priest Tier 6 Trinket (Ashtongue Talisman of Acumen)
7237 case 40438:
7238 {
7239 // Shadow Word: Pain
7240 if (procSpell->SpellFamilyFlags[0] & 0x8000)
7241 triggered_spell_id = 40441;
7242 // Renew
7243 else if (procSpell->SpellFamilyFlags[0] & 0x40)
7244 triggered_spell_id = 40440;
7245 else
7246 return false;
7247
7248 target = this;
7249 break;
7250 }
7251 // Improved Shadowform
7252 case 47570:
7253 case 47569:
7254 {
7255 if (!roll_chance_i(triggerAmount))
7256 return false;
7257
7259 break;
7260 }
7261 // Glyph of Dispel Magic
7262 case 55677:
7263 {
7264 // Dispel Magic shares spellfamilyflag with abolish disease
7265 if (procSpell->SpellIconID != 74)
7266 return false;
7267 if (!target || !target->IsFriendlyTo(this))
7268 return false;
7269
7270 basepoints0 = int32(target->CountPctFromMaxHealth(triggerAmount));
7271 triggered_spell_id = 56131;
7272 break;
7273 }
7274 // Oracle Healing Bonus ("Garments of the Oracle" set)
7275 case 26169:
7276 {
7277 // heal amount
7278 basepoints0 = int32(CalculatePct(damage, 10));
7279 target = this;
7280 triggered_spell_id = 26170;
7281 break;
7282 }
7283 // Frozen Shadoweave (Shadow's Embrace set) warning! its not only priest set
7284 case 39372:
7285 {
7286 if (!procSpell || (procSpell->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_SHADOW)) == 0)
7287 return false;
7288
7289 // heal amount
7290 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7291 target = this;
7292 triggered_spell_id = 39373;
7293 break;
7294 }
7295 // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
7296 case 28809:
7297 {
7298 triggered_spell_id = 28810;
7299 break;
7300 }
7301 // Priest T10 Healer 2P Bonus
7302 case 70770:
7303 // Flash Heal
7304 if (procSpell->SpellFamilyFlags[0] & 0x800)
7305 {
7306 triggered_spell_id = 70772;
7307 SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id);
7308 if (!blessHealing || !victim)
7309 return false;
7310 basepoints0 = int32(CalculatePct(damage, triggerAmount) / (blessHealing->GetMaxDuration() / blessHealing->Effects[0].Amplitude));
7311 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
7312 return true;
7313 }
7314 break;
7315 }
7316 break;
7317 }
7318 case SPELLFAMILY_DRUID:
7319 {
7320 switch (dummySpell->Id)
7321 {
7322 // Glyph of Innervate
7323 case 54832:
7324 {
7325 if (procSpell->SpellIconID != 62)
7326 return false;
7327
7328 int32 mana_perc = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcValue();
7329 basepoints0 = int32(CalculatePct(GetCreatePowers(POWER_MANA), mana_perc) / 10);
7330 triggered_spell_id = 54833;
7331 target = this;
7332 break;
7333 }
7334 // Glyph of Starfire
7335 case 54845:
7336 {
7337 triggered_spell_id = 54846;
7338 break;
7339 }
7340 // Glyph of Shred
7341 case 54815:
7342 {
7343 if (!target)
7344 return false;
7345
7346 // try to find spell Rip on the target
7347 if (AuraEffect const* AurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, GetGUID()))
7348 {
7349 // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip
7350 uint32 CountMin = AurEff->GetBase()->GetMaxDuration();
7351
7352 // just Rip's max duration without other spells
7353 uint32 CountMax = AurEff->GetSpellInfo()->GetMaxDuration();
7354
7355 // add possible auras' and Glyph of Shred's max duration
7356 CountMax += 3 * triggerAmount * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds
7357 CountMax += HasAura(54818) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds
7358 CountMax += HasAura(60141) ? 4 * IN_MILLISECONDS : 0; // Rip Duration/Lacerate Damage -> +4 seconds
7359
7360 // if min < max -> that means caster didn't cast 3 shred yet
7361 // so set Rip's duration and max duration
7362 if (CountMin < CountMax)
7363 {
7364 AurEff->GetBase()->SetDuration(AurEff->GetBase()->GetDuration() + triggerAmount * IN_MILLISECONDS);
7365 AurEff->GetBase()->SetMaxDuration(CountMin + triggerAmount * IN_MILLISECONDS);
7366 return true;
7367 }
7368 }
7369 // if not found Rip
7370 return false;
7371 }
7372 // Glyph of Rake
7373 case 54821:
7374 {
7375 if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3)
7376 {
7377 if (target && target->GetTypeId() == TYPEID_UNIT)
7378 {
7379 triggered_spell_id = 54820;
7380 break;
7381 }
7382 }
7383 return false;
7384 }
7385 // Leader of the Pack
7386 case 24932:
7387 {
7388 if (triggerAmount <= 0)
7389 return false;
7390 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
7391 target = this;
7392 triggered_spell_id = 34299;
7393 if (triggeredByAura->GetCasterGUID() != GetGUID())
7394 break;
7395 int32 basepoints1 = CalculatePct(GetMaxPower(Powers(POWER_MANA)), triggerAmount * 2);
7396 // Improved Leader of the Pack
7397 // Check cooldown of heal spell cooldown
7398 if (IsPlayer() && !ToPlayer()->HasSpellCooldown(34299))
7399 CastCustomSpell(this, 68285, &basepoints1, 0, 0, true, 0, triggeredByAura);
7400 break;
7401 }
7402 // Healing Touch (Dreamwalker Raiment set)
7403 case 28719:
7404 {
7405 // mana back
7406 basepoints0 = int32(CalculatePct(spellProc->GetPowerCost(), 30));
7407 target = this;
7408 triggered_spell_id = 28742;
7409 break;
7410 }
7411 // Glyph of Rejuvenation
7412 case 54754:
7413 {
7414 if (!victim || !victim->HealthBelowPct(uint32(triggerAmount)))
7415 return false;
7416 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7417 triggered_spell_id = 54755;
7418 break;
7419 }
7420 // Healing Touch Refund (Idol of Longevity trinket)
7421 case 28847:
7422 {
7423 target = this;
7424 triggered_spell_id = 28848;
7425 break;
7426 }
7427 // Mana Restore (Malorne Raiment set / Malorne Regalia set)
7428 case 37288:
7429 case 37295:
7430 {
7431 target = this;
7432 triggered_spell_id = 37238;
7433 break;
7434 }
7435 // Druid Tier 6 Trinket
7436 case 40442:
7437 {
7438 float chance;
7439
7440 // Starfire
7441 if (procSpell->SpellFamilyFlags[0] & 0x4)
7442 {
7443 triggered_spell_id = 40445;
7444 chance = 25.0f;
7445 }
7446 // Rejuvenation
7447 else if (procSpell->SpellFamilyFlags[0] & 0x10)
7448 {
7449 triggered_spell_id = 40446;
7450 chance = 25.0f;
7451 }
7452 // Mangle (Bear) and Mangle (Cat)
7453 else if (procSpell->SpellFamilyFlags[1] & 0x00000440)
7454 {
7455 triggered_spell_id = 40452;
7456 chance = 40.0f;
7457 }
7458 else
7459 return false;
7460
7461 if (!roll_chance_f(chance))
7462 return false;
7463
7464 target = this;
7465 break;
7466 }
7467 // Maim Interrupt
7468 case 44835:
7469 {
7470 // Deadly Interrupt Effect
7471 triggered_spell_id = 32747;
7472 break;
7473 }
7474 // Item - Druid T10 Restoration 4P Bonus (Rejuvenation)
7475 case 70664:
7476 {
7477 // xinef: proc only from normal Rejuvenation, and proc rejuvenation
7478 if (!victim || !procSpell || procSpell->SpellIconID != 64)
7479 return false;
7480
7481 Player* caster = ToPlayer();
7482 if (!caster)
7483 return false;
7484 if (!caster->GetGroup() && victim == this)
7485 return false;
7486
7487 CastCustomSpell(70691, SPELLVALUE_BASE_POINT0, damage, victim, true);
7488 return true;
7489 }
7490 }
7491 // Eclipse
7492 if (dummySpell->SpellIconID == 2856 && IsPlayer())
7493 {
7494 if (!procSpell || effIndex != 0)
7495 return false;
7496
7497 bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1);
7498
7499 if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f)))
7500 return false;
7501
7502 target = this;
7503 if (target->HasAura(isWrathSpell ? 48517 : 48518))
7504 return false;
7505
7506 triggered_spell_id = isWrathSpell ? 48518 : 48517;
7507 break;
7508 }
7509 [[fallthrough]];
7510 }
7511 case SPELLFAMILY_ROGUE:
7512 {
7513 switch(dummySpell->Id)
7514 {
7515 // Glyph of Backstab
7516 case 56800:
7517 {
7518 if (victim)
7519 if (AuraEffect* aurEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0, 0, GetGUID()))
7520 if (Aura* aur = aurEff->GetBase())
7521 if (!aur->IsRemoved() && aur->GetDuration() > 0)
7522 if ((aur->GetApplyTime() + aur->GetMaxDuration() / 1000 + 5) > (GameTime::GetGameTime().count() + aur->GetDuration() / 1000) )
7523 {
7524 aur->SetDuration(aur->GetDuration() + 2000);
7525 return true;
7526 }
7527 return false;
7528 }
7529 // Deadly Throw Interrupt
7530 case 32748:
7531 {
7532 // Prevent cast Deadly Throw Interrupt on self from last effect (apply dummy) of Deadly Throw
7533 if (this == victim)
7534 return false;
7535
7536 triggered_spell_id = 32747;
7537 break;
7538 }
7539 }
7540 // Master of subtlety
7541 if( dummySpell->SpellIconID == 2114 )
7542 {
7543 triggered_spell_id = 31665;
7544 basepoints0 = triggerAmount;
7545 break;
7546 }
7547 // Cut to the Chase
7548 if (dummySpell->SpellIconID == 2909)
7549 {
7550 // "refresh your Slice and Dice duration to its 5 combo point maximum"
7551 // lookup Slice and Dice
7552 if (AuraEffect const* aur = GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0))
7553 {
7554 aur->GetBase()->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true);
7555 return true;
7556 }
7557 return false;
7558 }
7559 // Deadly Brew
7560 else if (dummySpell->SpellIconID == 2963)
7561 {
7562 triggered_spell_id = 3409;
7563 break;
7564 }
7565 // Quick Recovery
7566 else if (dummySpell->SpellIconID == 2116)
7567 {
7568 if (!procSpell)
7569 return false;
7570
7571 // energy cost save
7572 basepoints0 = CalculatePct(int32(procSpell->ManaCost), triggerAmount);
7573 if (basepoints0 <= 0)
7574 return false;
7575
7576 target = this;
7577 triggered_spell_id = 31663;
7578 break;
7579 }
7580 break;
7581 }
7582 case SPELLFAMILY_HUNTER:
7583 {
7584 switch (dummySpell->SpellIconID)
7585 {
7586 case 2236: // Thrill of the Hunt
7587 {
7588 if (!procSpell)
7589 return false;
7590
7592
7593 // Disable charge drop because of Lock and Load
7594 if (spell)
7595 ToPlayer()->SetSpellModTakingSpell(spell, false);
7596
7597 // Explosive Shot
7598 if (procSpell->SpellFamilyFlags[2] & 0x200)
7599 {
7600 if (!victim)
7601 return false;
7602 if (AuraEffect const* pEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x0, 0x80000000, 0x0, GetGUID()))
7603 basepoints0 = pEff->GetSpellInfo()->CalcPowerCost(this, SpellSchoolMask(pEff->GetSpellInfo()->SchoolMask)) * 4 / 10 / 3;
7604 }
7605 else
7606 basepoints0 = procSpell->CalcPowerCost(this, SpellSchoolMask(procSpell->SchoolMask)) * 4 / 10;
7607
7608 if (spell)
7609 ToPlayer()->SetSpellModTakingSpell(spell, true);
7610
7611 if (basepoints0 <= 0)
7612 return false;
7613
7614 target = this;
7615 triggered_spell_id = 34720;
7616 break;
7617 }
7618 case 3406: // Hunting Party
7619 {
7620 triggered_spell_id = 57669;
7621 target = this;
7622 break;
7623 }
7624 case 3560: // Rapid Recuperation
7625 {
7626 // This effect only from Rapid Killing (mana regen)
7627 if (!(procSpell->SpellFamilyFlags[1] & 0x01000000))
7628 return false;
7629
7630 target = this;
7631
7632 switch (dummySpell->Id)
7633 {
7634 case 53228: // Rank 1
7635 triggered_spell_id = 56654;
7636 break;
7637 case 53232: // Rank 2
7638 triggered_spell_id = 58882;
7639 break;
7640 }
7641 break;
7642 }
7643 }
7644
7645 switch (dummySpell->Id)
7646 {
7647 case 57870: // Glyph of Mend Pet
7648 {
7649 if (!victim)
7650 return false;
7651
7652 victim->CastSpell(victim, 57894, true, nullptr, nullptr, GetGUID());
7653 return true;
7654 }
7655 }
7656 break;
7657 }
7659 {
7660 // Light's Beacon - Beacon of Light
7661 if (dummySpell->Id == 53651)
7662 {
7663 if (!victim)
7664 return false;
7665
7666 // Do not proc from Glyph of Holy Light and Judgement of Light
7667 if (procSpell->Id == 20267 || procSpell->Id == 54968)
7668 {
7669 return false;
7670 }
7671
7672 Unit* beaconTarget = triggeredByAura->GetBase()->GetCaster();
7673 if (!beaconTarget || beaconTarget == this || !beaconTarget->GetAura(53563, victim->GetGUID()))
7674 return false;
7675
7676 basepoints0 = int32(damage);
7677 triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
7678
7679 victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura, victim->GetGUID());
7680 return true;
7681 }
7682 // Judgements of the Wise
7683 if (dummySpell->SpellIconID == 3017)
7684 {
7685 target = this;
7686 triggered_spell_id = 31930;
7687 // replenishment
7688 CastSpell(this, 57669, true, castItem, triggeredByAura);
7689 break;
7690 }
7691 // Righteous Vengeance
7692 if (dummySpell->SpellIconID == 3025)
7693 {
7694 if (!victim)
7695 return false;
7696
7697 // 4 damage tick
7698 basepoints0 = triggerAmount * damage / 400;
7699 triggered_spell_id = 61840;
7700 // Add remaining ticks to damage done
7701 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
7702 return true;
7703 }
7704 // Sheath of Light
7705 if (dummySpell->SpellIconID == 3030)
7706 {
7707 // 4 healing tick
7708 basepoints0 = triggerAmount * damage / 400;
7709 triggered_spell_id = 54203;
7710 break;
7711 }
7712 switch (dummySpell->Id)
7713 {
7714 // Judgement of Light
7715 case 20185:
7716 {
7717 if (!victim || !victim->IsAlive() || victim->HasSpellCooldown(20267))
7718 return false;
7719 // 2% of base mana
7720 basepoints0 = int32(victim->CountPctFromMaxHealth(2));
7721 victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura);
7722 victim->AddSpellCooldown(20267, 0, 4 * IN_MILLISECONDS);
7723 return true;
7724 }
7725 // Judgement of Wisdom
7726 case 20186:
7727 {
7728 if (!victim || !victim->IsAlive() || !victim->HasActivePowerType(POWER_MANA) || victim->HasSpellCooldown(20268))
7729 return false;
7730
7731 // 2% of base mana
7732 basepoints0 = int32(CalculatePct(victim->GetCreateMana(), 2));
7733 victim->CastCustomSpell(victim, 20268, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura);
7734 victim->AddSpellCooldown(20268, 0, 4 * IN_MILLISECONDS);
7735 return true;
7736 }
7737 // Holy Power (Redemption Armor set)
7738 case 28789:
7739 {
7740 if (!victim)
7741 return false;
7742
7743 // Set class defined buff
7744 switch (victim->getClass())
7745 {
7746 case CLASS_PALADIN:
7747 case CLASS_PRIEST:
7748 case CLASS_SHAMAN:
7749 case CLASS_DRUID:
7750 triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
7751 break;
7752 case CLASS_MAGE:
7753 case CLASS_WARLOCK:
7754 triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
7755 break;
7756 case CLASS_HUNTER:
7757 case CLASS_ROGUE:
7758 triggered_spell_id = 28791; // Increases the friendly target's attack power by $s1 for $d.
7759 break;
7760 case CLASS_WARRIOR:
7761 triggered_spell_id = 28790; // Increases the friendly target's armor
7762 break;
7763 default:
7764 return false;
7765 }
7766 break;
7767 }
7768 // Seal of Vengeance (damage calc on apply aura)
7769 case 31801:
7770 {
7771 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7772 return false;
7773
7774 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7775 bool stacker = !procSpell || procSpell->Id == 53595;
7776 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7777 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7778
7779 if (!stacker && !damager)
7780 return false;
7781
7782 triggered_spell_id = 31803;
7783
7784 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7785 {
7786 if (aur->GetStackAmount() == 5)
7787 {
7788 if (stacker)
7789 aur->RefreshDuration();
7790 }
7791 }
7792
7793 CastSpell(victim, 42463, true, castItem, triggeredByAura); // Seal of Vengeance
7794
7795 if (!stacker)
7796 return false;
7797 break;
7798 }
7799 // Seal of Corruption
7800 case 53736:
7801 {
7802 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7803 return false;
7804
7805 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7806 bool stacker = !procSpell || procSpell->Id == 53595;
7807 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7808 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7809
7810 if (!stacker && !damager)
7811 return false;
7812
7813 triggered_spell_id = 53742;
7814
7815 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7816 {
7817 if (aur->GetStackAmount() == 5)
7818 {
7819 if (stacker)
7820 aur->RefreshDuration();
7821 }
7822 }
7823
7824 CastSpell(victim, 53739, true, castItem, triggeredByAura); // Seal of Corruption
7825
7826 if (!stacker)
7827 return false;
7828 break;
7829 }
7830 // Spiritual Attunement
7831 case 31785:
7832 case 33776:
7833 {
7834 // if healed by another unit (victim)
7835 if (this == victim)
7836 return false;
7837
7838 // dont allow non-positive dots to proc
7839 if (!procSpell || !procSpell->IsPositive())
7840 return false;
7841
7842 HealInfo const* healInfo = eventInfo.GetHealInfo();
7843 if (!healInfo)
7844 {
7845 return false;
7846 }
7847
7848 uint32 effectiveHeal = healInfo->GetEffectiveHeal();
7849 if (effectiveHeal)
7850 {
7851 // heal amount
7852 basepoints0 = int32(CalculatePct(effectiveHeal, triggerAmount));
7853 target = this;
7854
7855 if (basepoints0)
7856 triggered_spell_id = 31786;
7857 }
7858 break;
7859 }
7860 // Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
7861 case 40470:
7862 {
7863 if (!procSpell)
7864 return false;
7865
7866 float chance = 0.0f;
7867
7868 // Flash of light/Holy light
7869 if (procSpell->SpellFamilyFlags[0] & 0xC0000000)
7870 {
7871 triggered_spell_id = 40471;
7872 chance = 15.0f;
7873 }
7874 // Judgement (any)
7875 else if (procSpell->SpellFamilyFlags[0] & 0x800000)
7876 {
7877 triggered_spell_id = 40472;
7878 chance = 50.0f;
7879 }
7880 else
7881 return false;
7882
7883 if (!roll_chance_f(chance))
7884 return false;
7885
7886 break;
7887 }
7888 // Glyph of Holy Light
7889 case 54937:
7890 {
7891 triggered_spell_id = 54968;
7892 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7893 break;
7894 }
7895 // Item - Paladin T8 Holy 2P Bonus
7896 case 64890:
7897 {
7898 triggered_spell_id = 64891;
7899 basepoints0 = triggerAmount * damage / 300;
7900 break;
7901 }
7902 case 71406: // Tiny Abomination in a Jar
7903 case 71545: // Tiny Abomination in a Jar (Heroic)
7904 {
7905 if (!victim || !victim->IsAlive())
7906 return false;
7907
7908 CastSpell(this, 71432, true, nullptr, triggeredByAura);
7909
7910 Aura const* dummy = GetAura(71432);
7911 if (!dummy || dummy->GetStackAmount() < (dummySpell->Id == 71406 ? 8 : 7))
7912 return false;
7913
7914 RemoveAurasDueToSpell(71432);
7915 triggered_spell_id = 71433; // default main hand attack
7916 // roll if offhand
7917 if (Player const* player = ToPlayer())
7918 if (player->GetWeaponForAttack(OFF_ATTACK, true) && urand(0, 1))
7919 triggered_spell_id = 71434;
7920 target = victim;
7921 break;
7922 }
7923 // Item - Icecrown 25 Normal Dagger Proc
7924 case 71880:
7925 {
7926 switch (getPowerType())
7927 {
7928 case POWER_MANA:
7929 triggered_spell_id = 71881;
7930 break;
7931 case POWER_RAGE:
7932 triggered_spell_id = 71883;
7933 break;
7934 case POWER_ENERGY:
7935 triggered_spell_id = 71882;
7936 break;
7937 case POWER_RUNIC_POWER:
7938 triggered_spell_id = 71884;
7939 break;
7940 default:
7941 return false;
7942 }
7943 break;
7944 }
7945 // Item - Icecrown 25 Heroic Dagger Proc
7946 case 71892:
7947 {
7948 switch (getPowerType())
7949 {
7950 case POWER_MANA:
7951 triggered_spell_id = 71888;
7952 break;
7953 case POWER_RAGE:
7954 triggered_spell_id = 71886;
7955 break;
7956 case POWER_ENERGY:
7957 triggered_spell_id = 71887;
7958 break;
7959 case POWER_RUNIC_POWER:
7960 triggered_spell_id = 71885;
7961 break;
7962 default:
7963 return false;
7964 }
7965 break;
7966 }
7967 }
7968 break;
7969 }
7970 case SPELLFAMILY_SHAMAN:
7971 {
7972 switch (dummySpell->Id)
7973 {
7974 // Tidal Force
7975 case 55198:
7976 {
7977 // Remove aura stack from caster
7978 RemoveAuraFromStack(55166);
7979 // drop charges
7980 return false;
7981 }
7982 // Totemic Power (The Earthshatterer set)
7983 case 28823:
7984 {
7985 if (!victim)
7986 return false;
7987
7988 // Set class defined buff
7989 switch (victim->getClass())
7990 {
7991 case CLASS_PALADIN:
7992 case CLASS_PRIEST:
7993 case CLASS_SHAMAN:
7994 case CLASS_DRUID:
7995 triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
7996 break;
7997 case CLASS_MAGE:
7998 case CLASS_WARLOCK:
7999 triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8000 break;
8001 case CLASS_HUNTER:
8002 case CLASS_ROGUE:
8003 triggered_spell_id = 28826; // Increases the friendly target's attack power by $s1 for $d.
8004 break;
8005 case CLASS_WARRIOR:
8006 triggered_spell_id = 28827; // Increases the friendly target's armor
8007 break;
8008 default:
8009 return false;
8010 }
8011 break;
8012 }
8013 // Lesser Healing Wave (Totem of Flowing Water Relic)
8014 case 28849:
8015 {
8016 target = this;
8017 triggered_spell_id = 28850;
8018 break;
8019 }
8020 // Windfury Weapon (Passive) 1-8 Ranks
8021 case 33757:
8022 {
8023 Player* player = ToPlayer();
8024 if (!player || !castItem || !castItem->IsEquipped() || !victim || !victim->IsAlive())
8025 return false;
8026
8027 if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID())
8028 return false;
8029
8030 WeaponAttackType attType = WeaponAttackType(player->GetAttackBySlot(castItem->GetSlot()));
8031 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8032 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8033 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8034 return false;
8035
8036 // Now amount of extra power stored in 1 effect of Enchant spell
8037 // Get it by item enchant id
8038 uint32 spellId;
8040 {
8041 case 283:
8042 spellId = 8232;
8043 break; // 1 Rank
8044 case 284:
8045 spellId = 8235;
8046 break; // 2 Rank
8047 case 525:
8048 spellId = 10486;
8049 break; // 3 Rank
8050 case 1669:
8051 spellId = 16362;
8052 break; // 4 Rank
8053 case 2636:
8054 spellId = 25505;
8055 break; // 5 Rank
8056 case 3785:
8057 spellId = 58801;
8058 break; // 6 Rank
8059 case 3786:
8060 spellId = 58803;
8061 break; // 7 Rank
8062 case 3787:
8063 spellId = 58804;
8064 break; // 8 Rank
8065 default:
8066 {
8067 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled item enchantment (rank?) {} for spell id: {} (Windfury)",
8068 castItem->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)), dummySpell->Id);
8069 return false;
8070 }
8071 }
8072
8073 SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
8074 if (!windfurySpellInfo)
8075 {
8076 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non-existing spell id: {} (Windfury)", spellId);
8077 return false;
8078 }
8079
8080 int32 extra_attack_power = CalculateSpellDamage(victim, windfurySpellInfo, 1);
8081
8082 // Value gained from additional AP
8083 basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(attType) / 1000);
8084
8085 if (procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8086 triggered_spell_id = 25504;
8087
8088 if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8089 triggered_spell_id = 33750;
8090
8091 // custom cooldown processing case
8092 if (player->HasSpellCooldown(dummySpell->Id))
8093 return false;
8094
8095 // apply cooldown before cast to prevent processing itself
8096 player->AddSpellCooldown(dummySpell->Id, 0, 3 * IN_MILLISECONDS);
8097
8098 // Attack Twice
8099 for (uint32 i = 0; i < 2; ++i)
8100 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8101
8102 return true;
8103 }
8104 // Shaman Tier 6 Trinket
8105 case 40463:
8106 {
8107 if (!procSpell)
8108 return false;
8109
8110 float chance;
8111 if (procSpell->SpellFamilyFlags[0] & 0x1)
8112 {
8113 triggered_spell_id = 40465; // Lightning Bolt
8114 chance = 15.0f;
8115 }
8116 else if (procSpell->SpellFamilyFlags[0] & 0x80)
8117 {
8118 triggered_spell_id = 40465; // Lesser Healing Wave
8119 chance = 10.0f;
8120 }
8121 else if (procSpell->SpellFamilyFlags[1] & 0x00000010)
8122 {
8123 triggered_spell_id = 40466; // Stormstrike
8124 chance = 50.0f;
8125 }
8126 else
8127 return false;
8128
8129 if (!roll_chance_f(chance))
8130 return false;
8131
8132 target = this;
8133 break;
8134 }
8135 // Glyph of Healing Wave
8136 case 55440:
8137 {
8138 // Not proc from self heals
8139 if (this == victim)
8140 return false;
8141 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8142 target = this;
8143 triggered_spell_id = 55533;
8144 break;
8145 }
8146 // Spirit Hunt
8147 case 58877:
8148 {
8149 // Cast on owner
8150 target = GetOwner();
8151 if (!target)
8152 return false;
8153 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8154 triggered_spell_id = 58879;
8155 // Heal wolf
8156 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8157 break;
8158 }
8159 // Shaman T9 Elemental 4P Bonus
8160 case 67228:
8161 {
8162 // Lava Burst
8163 if (procSpell->SpellFamilyFlags[1] & 0x1000)
8164 {
8165 triggered_spell_id = 71824;
8166 SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id);
8167 if (!triggeredSpell)
8168 return false;
8169 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].Amplitude);
8170 }
8171 break;
8172 }
8173 // Item - Shaman T10 Elemental 4P Bonus
8174 case 70817:
8175 {
8176 if (!target)
8177 return false;
8178 // try to find spell Flame Shock on the target
8179 if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, GetGUID()))
8180 {
8181 Aura* flameShock = aurEff->GetBase();
8182 int32 extraTime = 2 * aurEff->GetAmplitude();
8183 flameShock->SetMaxDuration(flameShock->GetMaxDuration() + extraTime);
8184 flameShock->SetDuration(flameShock->GetDuration() + extraTime);
8185
8186 return true;
8187 }
8188 // if not found Flame Shock
8189 return false;
8190 }
8191 break;
8192 }
8193 // Frozen Power
8194 if (dummySpell->SpellIconID == 3780)
8195 {
8196 if (!target)
8197 return false;
8198 if (GetDistance(target) < 15.0f)
8199 return false;
8200 float chance = (float)triggerAmount;
8201 if (!roll_chance_f(chance))
8202 return false;
8203
8204 triggered_spell_id = 63685;
8205 break;
8206 }
8207 // Ancestral Awakening
8208 if (dummySpell->SpellIconID == 3065)
8209 {
8210 triggered_spell_id = 52759;
8211 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8212 target = this;
8213 break;
8214 }
8215 // Flametongue Weapon (Passive)
8216 if (dummySpell->SpellFamilyFlags[0] & 0x200000)
8217 {
8218 if (GetTypeId() != TYPEID_PLAYER || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped())
8219 return false;
8220
8222 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8223 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8224 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8225 return false;
8226
8227 float fire_onhit = float(CalculatePct(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f));
8228
8229 float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE)
8231
8232 // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84%
8233 ApplyPct(add_spellpower, 3.84f);
8234
8235 // Enchant on Off-Hand and ready?
8236 if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8237 {
8238 float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f;
8239
8240 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8241 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8242 triggered_spell_id = 10444;
8243 }
8244
8245 // Enchant on Main-Hand and ready?
8246 else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8247 {
8248 float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f;
8249
8250 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8251 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8252 triggered_spell_id = 10444;
8253 }
8254
8255 // If not ready, we should return, shouldn't we?!
8256 else
8257 return false;
8258
8259 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8260 return true;
8261 }
8262 // Improved Water Shield
8263 if (dummySpell->SpellIconID == 2287)
8264 {
8265 if (!procSpell)
8266 return false;
8267
8268 // Default chance for Healing Wave and Riptide
8269 float chance = (float)triggeredByAura->GetAmount();
8270
8271 if (procSpell->SpellFamilyFlags[0] & 0x80)
8272 // Lesser Healing Wave - 0.6 of default
8273 chance *= 0.6f;
8274 else if (procSpell->SpellFamilyFlags[0] & 0x100)
8275 // Chain heal - 0.3 of default
8276 chance *= 0.3f;
8277
8278 if (!roll_chance_f(chance))
8279 return false;
8280
8281 // Water Shield
8282 if (AuraEffect const* aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020, 0))
8283 {
8284 uint32 spell = aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
8285 CastSpell(this, spell, true, castItem, triggeredByAura);
8286 return true;
8287 }
8288 return false;
8289 }
8290 // Lightning Overload
8291 if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
8292 {
8293 if(!procSpell || GetTypeId() != TYPEID_PLAYER || !victim)
8294 return false;
8295
8296 if (procEx & PROC_EX_CRITICAL_HIT)
8297 damage /= 2;
8298
8299 // do not proc off from itself
8300 if (procSpell->Id == 45297 || procSpell->Id == 45284)
8301 {
8302 return false;
8303 }
8304
8305 do
8306 {
8307 uint32 spell = 0;
8308
8309 if (procSpell->SpellFamilyFlags[0] & 0x2)
8310 {
8311 // 1/3 of 33% if 11%
8312 if (!roll_chance_i(33))
8313 return false;
8314
8315 spell = 45297;
8316 }
8317 else
8318 spell = 45284;
8319
8320 // do not reduce damage-spells have correct basepoints
8321 damage /= 2;
8322 int32 dmg = damage;
8323
8324 // Cast
8325 CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
8326 } while (roll_chance_i(33));
8327 return true;
8328 }
8329 // Static Shock
8330 if (dummySpell->SpellIconID == 3059)
8331 {
8332 // Lightning Shield
8334 {
8335 uint32 spell = sSpellMgr->GetSpellWithRank(26364, aurEff->GetSpellInfo()->GetRank());
8336 CastSpell(target, spell, true, castItem, triggeredByAura);
8337 aurEff->GetBase()->DropCharge();
8338 return true;
8339 }
8340 return false;
8341 }
8342 break;
8343 }
8345 {
8346 // Improved Blood Presence
8347 if (dummySpell->SpellIconID == 2636)
8348 {
8349 if (GetTypeId() != TYPEID_PLAYER)
8350 return false;
8351 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8352 break;
8353 }
8354 // Butchery
8355 if (dummySpell->SpellIconID == 2664)
8356 {
8357 basepoints0 = triggerAmount;
8358 triggered_spell_id = 50163;
8359 target = this;
8360 break;
8361 }
8362 // Mark of Blood
8363 if (dummySpell->Id == 49005)
8364 {
8366 triggered_spell_id = 61607;
8367 break;
8368 }
8369 // Unholy Blight
8370 if (dummySpell->Id == 49194)
8371 {
8372 triggered_spell_id = 50536;
8373 SpellInfo const* unholyBlight = sSpellMgr->GetSpellInfo(triggered_spell_id);
8374 if (!unholyBlight || !victim)
8375 return false;
8376
8377 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8378
8379 //Glyph of Unholy Blight
8380 if (AuraEffect* glyph = GetAuraEffect(63332, 0))
8381 AddPct(basepoints0, glyph->GetAmount());
8382
8383 basepoints0 = basepoints0 / (unholyBlight->GetMaxDuration() / unholyBlight->Effects[0].Amplitude);
8384 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
8385 return true;
8386 }
8387 // Vendetta
8388 if (dummySpell->SpellFamilyFlags[0] & 0x10000)
8389 {
8390 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
8391 triggered_spell_id = 50181;
8392 target = this;
8393 break;
8394 }
8395 // Necrosis
8396 if (dummySpell->SpellIconID == 2709)
8397 {
8398 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8399 triggered_spell_id = 51460;
8400 break;
8401 }
8402 // Threat of Thassarian
8403 if (dummySpell->SpellIconID == 2023)
8404 {
8405 // Must Dual Wield
8406 if (!procSpell || !haveOffhandWeapon())
8407 return false;
8408 // Chance as basepoints for dummy aura
8409 if (!roll_chance_i(triggerAmount))
8410 return false;
8411
8412 switch (procSpell->Id)
8413 {
8414 // Obliterate
8415 case 49020:
8416 triggered_spell_id = 66198;
8417 break; // Rank 1
8418 case 51423:
8419 triggered_spell_id = 66972;
8420 break; // Rank 2
8421 case 51424:
8422 triggered_spell_id = 66973;
8423 break; // Rank 3
8424 case 51425:
8425 triggered_spell_id = 66974;
8426 break; // Rank 4
8427
8428 // Frost Strike
8429 case 49143:
8430 triggered_spell_id = 66196;
8431 break; // Rank 1
8432 case 51416:
8433 triggered_spell_id = 66958;
8434 break; // Rank 2
8435 case 51417:
8436 triggered_spell_id = 66959;
8437 break; // Rank 3
8438 case 51418:
8439 triggered_spell_id = 66960;
8440 break; // Rank 4
8441 case 51419:
8442 triggered_spell_id = 66961;
8443 break; // Rank 5
8444 case 55268:
8445 triggered_spell_id = 66962;
8446 break; // Rank 6
8447
8448 // Plague Strike
8449 case 45462:
8450 triggered_spell_id = 66216;
8451 break; // Rank 1
8452 case 49917:
8453 triggered_spell_id = 66988;
8454 break; // Rank 2
8455 case 49918:
8456 triggered_spell_id = 66989;
8457 break; // Rank 3
8458 case 49919:
8459 triggered_spell_id = 66990;
8460 break; // Rank 4
8461 case 49920:
8462 triggered_spell_id = 66991;
8463 break; // Rank 5
8464 case 49921:
8465 triggered_spell_id = 66992;
8466 break; // Rank 6
8467
8468 // Death Strike
8469 case 49998:
8470 triggered_spell_id = 66188;
8471 break; // Rank 1
8472 case 49999:
8473 triggered_spell_id = 66950;
8474 break; // Rank 2
8475 case 45463:
8476 triggered_spell_id = 66951;
8477 break; // Rank 3
8478 case 49923:
8479 triggered_spell_id = 66952;
8480 break; // Rank 4
8481 case 49924:
8482 triggered_spell_id = 66953;
8483 break; // Rank 5
8484
8485 // Rune Strike
8486 case 56815:
8487 triggered_spell_id = 66217;
8488 break; // Rank 1
8489
8490 // Blood Strike
8491 case 45902:
8492 triggered_spell_id = 66215;
8493 break; // Rank 1
8494 case 49926:
8495 triggered_spell_id = 66975;
8496 break; // Rank 2
8497 case 49927:
8498 triggered_spell_id = 66976;
8499 break; // Rank 3
8500 case 49928:
8501 triggered_spell_id = 66977;
8502 break; // Rank 4
8503 case 49929:
8504 triggered_spell_id = 66978;
8505 break; // Rank 5
8506 case 49930:
8507 triggered_spell_id = 66979;
8508 break; // Rank 6
8509 default:
8510 return false;
8511 }
8512
8513 // This should do, restore spell mod so next attack can also use this!
8514 // crit chance for first strike is already computed
8515 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 51124, nullptr); // Killing Machine
8516 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 49796, nullptr); // Deathchill
8517
8518 // Xinef: Somehow basepoints are divided by 2 which is later divided by 2 (offhand multiplier)
8519 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8520 if (triggerEntry->SchoolMask & SPELL_SCHOOL_MASK_NORMAL)
8521 basepoints0 = triggerEntry->Effects[EFFECT_0].BasePoints * 2;
8522
8523 SetCantProc(true);
8524 if(basepoints0)
8525 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8526 else
8527 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8528 SetCantProc(false);
8529 return true;
8530 }
8531 // Runic Power Back on Snare/Root
8532 if (dummySpell->Id == 61257)
8533 {
8534 // only for spells and hit/crit (trigger start always) and not start from self casted spells
8535 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
8536 return false;
8537 // Need snare or root mechanic
8538 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))))
8539 return false;
8540 triggered_spell_id = 61258;
8541 target = this;
8542 break;
8543 }
8544 // Sudden Doom
8545 if (dummySpell->SpellIconID == 1939 && IsPlayer())
8546 {
8547 SpellChainNode const* chain = nullptr;
8548 // get highest rank of the Death Coil spell
8549 PlayerSpellMap const& sp_list = ToPlayer()->GetSpellMap();
8550 for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
8551 {
8552 // check if shown in spell book
8553 if (!itr->second->Active || !itr->second->IsInSpec(ToPlayer()->GetActiveSpec()) || itr->second->State == PLAYERSPELL_REMOVED)
8554 continue;
8555
8556 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(itr->first);
8557 if (!spellProto)
8558 continue;
8559
8560 if (spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT
8561 && spellProto->SpellFamilyFlags[0] & 0x2000)
8562 {
8563 SpellChainNode const* newChain = sSpellMgr->GetSpellChainNode(itr->first);
8564
8565 // No chain entry or entry lower than found entry
8566 if (!chain || !newChain || (chain->rank < newChain->rank))
8567 {
8568 triggered_spell_id = itr->first;
8569 chain = newChain;
8570 }
8571 else
8572 continue;
8573 // Found spell is last in chain - do not need to look more
8574 // Optimisation for most common case
8575 if (chain && chain->last->Id == itr->first)
8576 break;
8577 }
8578 }
8579 }
8580 break;
8581 }
8582 case SPELLFAMILY_POTION:
8583 {
8584 // alchemist's stone
8585 if (dummySpell->Id == 17619)
8586 {
8587 if (procSpell->SpellFamilyName == SPELLFAMILY_POTION)
8588 {
8589 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++)
8590 {
8591 if (procSpell->Effects[i].Effect == SPELL_EFFECT_HEAL)
8592 {
8593 triggered_spell_id = 21399;
8594 }
8595 else if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE)
8596 {
8597 triggered_spell_id = 21400;
8598 }
8599 else
8600 continue;
8601
8602 basepoints0 = int32(CalculateSpellDamage(this, procSpell, i) * 0.4f);
8603 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, nullptr, triggeredByAura);
8604 }
8605 return true;
8606 }
8607 }
8608 break;
8609 }
8610 case SPELLFAMILY_PET:
8611 {
8612 switch (dummySpell->SpellIconID)
8613 {
8614 // Guard Dog
8615 case 201:
8616 {
8617 if (!victim)
8618 return false;
8619
8620 triggered_spell_id = 54445;
8621 target = this;
8622 float addThreat = float(CalculatePct(procSpell->Effects[0].CalcValue(this), triggerAmount));
8623 victim->AddThreat(this, addThreat);
8624 break;
8625 }
8626 // Silverback
8627 case 1582:
8628 triggered_spell_id = dummySpell->Id == 62765 ? 62801 : 62800;
8629 target = this;
8630 break;
8631 }
8632 break;
8633 }
8634 default:
8635 break;
8636 }
8637
8638 // if not handled by custom case, get triggered spell from dummySpell proto
8639 if (!triggered_spell_id)
8640 triggered_spell_id = dummySpell->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8641
8642 // processed charge only counting case
8643 if (!triggered_spell_id)
8644 return true;
8645
8646 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8647 if (!triggerEntry)
8648 {
8649 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: Spell {} has non-existing triggered spell {}", dummySpell->Id, triggered_spell_id);
8650 return false;
8651 }
8652
8653 if (cooldown_spell_id == 0)
8654 cooldown_spell_id = triggered_spell_id;
8655
8656 if (cooldown)
8657 {
8658 if (HasSpellCooldown(cooldown_spell_id))
8659 return false;
8660
8661 AddSpellCooldown(cooldown_spell_id, 0, cooldown);
8662 }
8663
8664 if(basepoints0)
8665 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8666 else
8667 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8668
8669 return true;
8670}
T ApplyPct(T &base, U pct)
Definition: Util.h:73
int32 irand(int32 min, int32 max)
Definition: Random.cpp:37
constexpr auto IN_MILLISECONDS
Definition: Common.h:52
EnchantmentSlot
Definition: Item.h:168
@ TEMP_ENCHANTMENT_SLOT
Definition: Item.h:170
WeaponAttackType
Definition: Unit.h:208
std::map< uint32, SpellCooldown > SpellCooldowns
Definition: Player.h:208
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition: Player.h:193
@ EQUIPMENT_SLOT_MAINHAND
Definition: Player.h:690
@ PLAYERSPELL_REMOVED
Definition: Player.h:122
@ SPELL_AURA_PROC_TRIGGER_SPELL
Definition: SpellAuraDefines.h:105
@ SPELL_AURA_HASTE_SPELLS
Definition: SpellAuraDefines.h:279
@ SPELL_AURA_MOD_MELEE_HASTE
Definition: SpellAuraDefines.h:201
@ SPELL_AURA_MOD_DECREASE_SPEED
Definition: SpellAuraDefines.h:96
@ SPELL_AURA_PERIODIC_DUMMY
Definition: SpellAuraDefines.h:289
@ PROC_EX_INTERNAL_HOT
Definition: SpellMgr.h:220
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS
Definition: SpellMgr.h:128
@ PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS
Definition: SpellMgr.h:122
static First const & RAND(First const &first, Second const &second, Rest const &... rest)
Definition: CreatureAIImpl.h:30
@ SPELL_EFFECT_ENERGIZE
Definition: SharedDefines.h:808
@ LANG_UNIVERSAL
Definition: SharedDefines.h:735
@ CLASS_DRUID
Definition: SharedDefines.h:151
@ CLASS_SHAMAN
Definition: SharedDefines.h:147
@ CLASS_PRIEST
Definition: SharedDefines.h:145
@ CLASS_WARLOCK
Definition: SharedDefines.h:149
@ CLASS_MAGE
Definition: SharedDefines.h:148
@ CLASS_PALADIN
Definition: SharedDefines.h:142
@ CLASS_ROGUE
Definition: SharedDefines.h:144
@ MECHANIC_STUN
Definition: SharedDefines.h:1337
@ MECHANIC_ROOT
Definition: SharedDefines.h:1332
@ MECHANIC_SNARE
Definition: SharedDefines.h:1336
@ SPELLFAMILY_WARLOCK
Definition: SharedDefines.h:3533
@ SPELLFAMILY_PALADIN
Definition: SharedDefines.h:3538
@ SPELLFAMILY_HUNTER
Definition: SharedDefines.h:3537
@ SPELLFAMILY_POTION
Definition: SharedDefines.h:3541
@ SPELLFAMILY_ROGUE
Definition: SharedDefines.h:3536
@ SPELLFAMILY_DRUID
Definition: SharedDefines.h:3535
@ SPELLFAMILY_PET
Definition: SharedDefines.h:3545
@ REP_EXALTED
Definition: SharedDefines.h:187
@ SPELL_SCHOOL_MASK_SHADOW
Definition: SharedDefines.h:302
@ SPELL_SCHOOL_MASK_FIRE
Definition: SharedDefines.h:299
@ SPELL_SCHOOL_MASK_FROST
Definition: SharedDefines.h:301
uint8 GetSlot() const
Definition: Item.h:278
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition: Item.h:301
bool IsEquipped() const
Definition: Item.cpp:790
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition: Player.cpp:10033
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition: Player.cpp:9891
bool HasSpellCooldown(uint32 spell_id) const override
Definition: Player.cpp:16281
PlayerSpellMap const & GetSpellMap() const
Definition: Player.h:1752
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition: Player.cpp:11041
SpellCooldowns GetSpellCooldowns() const
Definition: Player.h:2144
static uint8 GetAttackBySlot(uint8 slot)
Definition: PlayerStorage.cpp:565
ReputationRank GetReputationRank(uint32 faction_id) const
Definition: Player.cpp:5818
Unit * GetSelectedUnit() const
Definition: Player.cpp:11491
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition: Player.cpp:3502
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition: Player.cpp:9294
Item * GetItemByGuid(ObjectGuid guid) const
Definition: PlayerStorage.cpp:430
Spell * m_spellModTakingSpell
Definition: Player.h:2528
Definition: Unit.h:373
uint32 GetEffectiveHeal() const
Definition: Unit.h:413
uint32 GetCreatePowers(Powers power) const
Definition: Unit.cpp:15573
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition: Unit.cpp:5525
void RemoveAurasWithMechanic(uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
Definition: Unit.cpp:5197
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition: Unit.cpp:14764
void SetCantProc(bool apply)
Definition: Unit.h:1663
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:785
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:4864
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT=false)
Definition: Unit.cpp:11896
bool IsFriendlyTo(Unit const *unit) const
Definition: Unit.cpp:10176
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:11858
uint32 CountPctFromMaxHealth(int32 pct) const
Definition: Unit.h:790
void CastDelayedSpellWithPeriodicAmount(Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
Definition: Unit.cpp:20196
Powers getPowerType() const
Definition: Unit.h:800
void RemoveMovementImpairingAuras(bool withRoot)
Definition: Unit.cpp:5178
void SetMaxDuration(int32 duration)
Definition: SpellAuras.h:130
SpellInfo const * GetSpellInfo() const
Definition: Spell.h:575
int32 GetPowerCost() const
Definition: Spell.h:576
int32 GetMaxDuration() const
Definition: SpellInfo.cpp:2344
uint32 ProcChance
Definition: SpellInfo.h:356
Definition: SpellMgr.h:554
SpellInfo const * last
Definition: SpellMgr.h:558
uint8 rank
Definition: SpellMgr.h:559

References AddPct(), Player::AddSpellCooldown(), AddSpellCooldown(), AddThreat(), ApplyPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, SpellInfo::CalcPowerCost(), CalculatePct(), CalculateSpellDamage(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CountPctFromMaxHealth(), CURRENT_GENERIC_SPELL, EFFECT_0, EFFECT_1, SpellInfo::Effects, ObjectGuid::Empty, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, SpellInfo::EquippedItemClass, SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), Player::GetAttackBySlot(), GetAttackTime(), GetAura(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraEffect::GetCaster(), Aura::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetCharges(), getClass(), GetCreateMana(), GetCreatePowers(), WorldObject::GetDistance(), Aura::GetDuration(), Aura::GetEffect(), HealInfo::GetEffectiveHeal(), AuraEffect::GetEffIndex(), Item::GetEnchantmentId(), GameTime::GetGameTime(), Player::GetGroup(), GetGuardianPet(), Object::GetGUID(), ProcEventInfo::GetHealInfo(), Player::GetItemByGuid(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), GetMaxPower(), GetOwner(), Spell::GetPowerCost(), getPowerType(), ProcEventInfo::GetProcSpell(), Player::GetReputationRank(), SpellInfo::GetSchoolMask(), Player::GetSelectedUnit(), Item::GetSlot(), Player::GetSpellCooldowns(), AuraEffect::GetSpellInfo(), Player::GetSpellMap(), Aura::GetStackAmount(), Object::GetTypeId(), GetVictim(), HasActivePowerType(), HasAura(), Position::HasInArc(), Player::HasSpellCooldown(), HasSpellCooldown(), haveOffhandWeapon(), HealthBelowPct(), SpellInfo::Id, IN_MILLISECONDS, irand(), IsAlive(), Item::IsEquipped(), IsFriendlyTo(), Object::IsPlayer(), SpellInfo::IsPositive(), SpellInfo::IsRankOf(), LANG_UNIVERSAL, SpellChainNode::last, LOG_ERROR, m_currentSpells, Player::m_spellModTakingSpell, SpellInfo::ManaCost, MAX_SPELL_EFFECTS, MECHANIC_ROOT, MECHANIC_SNARE, MECHANIC_STUN, OFF_ATTACK, PLAYERSPELL_REMOVED, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, PROC_EX_CRITICAL_HIT, PROC_EX_INTERNAL_HOT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, SpellInfo::ProcChance, RAND(), SpellChainNode::rank, RemoveAura(), RemoveAuraFromStack(), RemoveAurasByType(), RemoveAurasDueToSpell(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), Player::RemoveSpellCooldown(), REP_EXALTED, Player::RestoreSpellMods(), roll_chance_f(), roll_chance_i(), Player::Say(), SpellInfo::SchoolMask, AuraEffect::SetAmount(), SetCantProc(), Aura::SetDuration(), Aura::SetMaxDuration(), Player::SetSpellModTakingSpell(), SPELL_AURA_DUMMY, SPELL_AURA_HASTE_SPELLS, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_DUMMY, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_EFFECT_ENERGIZE, SPELL_EFFECT_HEAL, SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_FROST, SPELL_SCHOOL_MASK_NORMAL, SPELL_SCHOOL_MASK_SHADOW, SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PET, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, SpellInfo::SpellVisual, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, and urand().

Referenced by ProcDamageAndSpellFor().

◆ HandleEmoteCommand()

void Unit::HandleEmoteCommand ( uint32  emoteId)
1965{
1967 packet.EmoteID = emoteId;
1968 packet.Guid = GetGUID();
1969 SendMessageToSet(packet.Write(), true);
1970}
Definition: ChatPackets.h:29
WorldPacket const * Write() override
Definition: ChatPackets.cpp:20
uint32 EmoteID
Definition: ChatPackets.h:35
ObjectGuid Guid
Definition: ChatPackets.h:36

References WorldPackets::Chat::Emote::EmoteID, Object::GetGUID(), WorldPackets::Chat::Emote::Guid, WorldObject::SendMessageToSet(), and WorldPackets::Chat::Emote::Write().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_viscidus::DamageTaken(), DealMeleeDamage(), boss_twinemperorsAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), StandUpEvent::Execute(), PartyTimeEmoteEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), WorldSession::HandleEmoteOpcode(), npc_commandscript::HandleNpcSayCommand(), npc_commandscript::HandleNpcYellCommand(), WorldSession::HandleTextEmoteOpcode(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_sentinel_leader::MovementInform(), npc_sentinel_infiltrator::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), npc_kalecgos::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), spell_gen_spectator_cheer_trigger::PrepareSpellScript(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), PetAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), CreatureTextMgr::SendEmote(), boss_grand_warlock_nethekurse::SetData(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_ahune::Submerge(), boss_nightbane::TriggerHealthTakeOff(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::npc_forest_frogAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_shenthul::npc_shenthulAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_highlord_tirion_fordring_lh::npc_highlord_tirion_fordringAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_valiance_keep_cannoneer::npc_valiance_keep_cannoneerAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_dancing_flames::npc_dancing_flamesAI::UpdateAI(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::UpdateAI(), npc_rocknot::npc_rocknotAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_taretha::npc_tarethaAI::WaypointReached(), npc_general_andorov::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleOverrideClassScriptAuraProc()

bool Unit::HandleOverrideClassScriptAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  cooldown 
)
private
9797{
9798 int32 scriptId = triggeredByAura->GetMiscValue();
9799
9800 if (!victim || !victim->IsAlive())
9801 return false;
9802
9803 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9804 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9805
9806 uint32 triggered_spell_id = 0;
9807
9808 switch (scriptId)
9809 {
9810 case 836: // Improved Blizzard (Rank 1)
9811 {
9812 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9813 return false;
9814 triggered_spell_id = 12484;
9815 break;
9816 }
9817 case 988: // Improved Blizzard (Rank 2)
9818 {
9819 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9820 return false;
9821 triggered_spell_id = 12485;
9822 break;
9823 }
9824 case 989: // Improved Blizzard (Rank 3)
9825 {
9826 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9827 return false;
9828 triggered_spell_id = 12486;
9829 break;
9830 }
9831 case 4533: // Dreamwalker Raiment 2 pieces bonus
9832 {
9833 // Chance 50%
9834 if (!roll_chance_i(50))
9835 return false;
9836
9837 switch (victim->getPowerType())
9838 {
9839 case POWER_MANA:
9840 triggered_spell_id = 28722;
9841 break;
9842 case POWER_RAGE:
9843 triggered_spell_id = 28723;
9844 break;
9845 case POWER_ENERGY:
9846 triggered_spell_id = 28724;
9847 break;
9848 default:
9849 return false;
9850 }
9851 break;
9852 }
9853 case 4537: // Dreamwalker Raiment 6 pieces bonus
9854 triggered_spell_id = 28750; // Blessing of the Claw
9855 break;
9856 case 5497: // Improved Mana Gems
9857 triggered_spell_id = 37445; // Mana Surge
9858 break;
9859 case 7010: // Revitalize - can proc on full hp target
9860 case 7011:
9861 case 7012:
9862 {
9863 if (!roll_chance_i(triggeredByAura->GetAmount()))
9864 return false;
9865 switch (victim->getPowerType())
9866 {
9867 case POWER_MANA:
9868 triggered_spell_id = 48542;
9869 break;
9870 case POWER_RAGE:
9871 triggered_spell_id = 48541;
9872 break;
9873 case POWER_ENERGY:
9874 triggered_spell_id = 48540;
9875 break;
9876 case POWER_RUNIC_POWER:
9877 triggered_spell_id = 48543;
9878 break;
9879 default:
9880 break;
9881 }
9882 break;
9883 }
9884 default:
9885 break;
9886 }
9887
9888 // not processed
9889 if (!triggered_spell_id)
9890 return false;
9891
9892 // standard non-dummy case
9893 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
9894
9895 if (!triggerEntry)
9896 {
9897 LOG_ERROR("entities.unit", "Unit::HandleOverrideClassScriptAuraProc: Spell {} triggering for class script id {}", triggered_spell_id, scriptId);
9898 return false;
9899 }
9900
9901 if (cooldown)
9902 {
9903 if (HasSpellCooldown(triggered_spell_id))
9904 return false;
9905
9906 AddSpellCooldown(triggered_spell_id, 0, cooldown);
9907 }
9908
9909 CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
9910
9911 return true;
9912}

References AddSpellCooldown(), CastSpell(), AuraEffect::GetAmount(), AuraEffect::GetBase(), Aura::GetCastItemGUID(), Player::GetItemByGuid(), AuraEffect::GetMiscValue(), getPowerType(), HasSpellCooldown(), IsAlive(), Object::IsPlayer(), LOG_ERROR, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, roll_chance_i(), SpellInfo::SpellVisual, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleProcExtraAttackFor()

void Unit::HandleProcExtraAttackFor ( Unit victim,
uint32  count 
)
2721{
2722 while (count)
2723 {
2724 --count;
2725 AttackerStateUpdate(victim, BASE_ATTACK, true);
2726 }
2727}
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition: Unit.cpp:2529

References AttackerStateUpdate(), and BASE_ATTACK.

Referenced by Update().

◆ HandleProcTriggerSpell()

bool Unit::HandleProcTriggerSpell ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
uint32  procPhase,
ProcEventInfo eventInfo 
)
private
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
8870{
8871 // Get triggered aura spell info
8872 SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo();
8873
8874 // Basepoints of trigger aura
8875 int32 triggerAmount = triggeredByAura->GetAmount();
8876
8877 // Set trigger spell id, target, custom basepoints
8878 uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8879
8880 Unit* target = nullptr;
8881 int32 basepoints0 = 0;
8882
8883 if (triggeredByAura->GetAuraType() == SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE)
8884 basepoints0 = triggerAmount;
8885
8886 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
8887 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
8888
8889 // Try handle unknown trigger spells
8890 //if (sSpellMgr->GetSpellInfo(trigger_spell_id) == nullptr)
8891 {
8892 switch (auraSpellInfo->SpellFamilyName)
8893 {
8895 switch (auraSpellInfo->Id)
8896 {
8897 case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
8898 // Pct value stored in dummy
8899 if (!victim)
8900 return false;
8901 basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100;
8902 target = victim;
8903 break;
8904 case 57345: // Darkmoon Card: Greatness
8905 {
8906 float stat = 0.0f;
8907 // strength
8908 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229; stat = GetStat(STAT_STRENGTH); }
8909 // agility
8910 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233; stat = GetStat(STAT_AGILITY); }
8911 // intellect
8912 if (GetStat(STAT_INTELLECT) > stat) { trigger_spell_id = 60234; stat = GetStat(STAT_INTELLECT);}
8913 // spirit
8914 if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; }
8915 break;
8916 }
8917 case 67702: // Death's Choice, Item - Coliseum 25 Normal Melee Trinket
8918 {
8919 if (!damage)
8920 return false;
8921 float stat = 0.0f;
8922 // strength
8923 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67708; stat = GetStat(STAT_STRENGTH); }
8924 // agility
8925 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67703; }
8926 break;
8927 }
8928 case 67771: // Death's Choice (heroic), Item - Coliseum 25 Heroic Melee Trinket
8929 {
8930 if (!damage)
8931 return false;
8932 float stat = 0.0f;
8933 // strength
8934 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67773; stat = GetStat(STAT_STRENGTH); }
8935 // agility
8936 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67772; }
8937 break;
8938 }
8939 // Mana Drain Trigger
8940 case 27522:
8941 case 40336:
8942 {
8943 // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
8944 if (IsAlive())
8945 CastSpell(this, 29471, true, castItem, triggeredByAura);
8946 if (victim && victim->IsAlive())
8947 CastSpell(victim, 27526, true, castItem, triggeredByAura);
8948 return true;
8949 }
8950 // Forge of Souls, Devourer of Souls, Mirrored Soul
8951 case 69023:
8952 {
8953 int32 dmg = damage * 0.45f;
8954 if (dmg > 0)
8955 if (Aura* a = GetAura(69023))
8956 if (Unit* c = a->GetCaster())
8957 CastCustomSpell(c, 69034, &dmg, 0, 0, true);
8958 return true;
8959 }
8960 // Soul-Trader Beacon proc aura
8961 case 50051:
8962 {
8963 if (!victim)
8964 return false;
8965
8967 cr->CastSpell(victim, 50101, true);
8968
8969 return false;
8970 }
8971 }
8972 break;
8973 case SPELLFAMILY_MAGE:
8974 if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
8975 {
8976 switch (auraSpellInfo->Id)
8977 {
8978 case 31641: // Rank 1
8979 case 31642: // Rank 2
8980 trigger_spell_id = 31643;
8981 break;
8982 default:
8983 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Blazing Speed", auraSpellInfo->Id);
8984 return false;
8985 }
8986 }
8987 else if (auraSpellInfo->Id == 71761) // Deep Freeze Immunity State (only permanent)
8988 {
8989 Creature* creature = victim->ToCreature();
8990 if (!creature || !creature->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1)))
8991 return false;
8992 }
8993 break;
8995 {
8996 // Nether Protection
8997 if (auraSpellInfo->SpellIconID == 1985)
8998 {
8999 if (!procSpell)
9000 return false;
9001 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9002 {
9004 return false; // ignore
9005 case SPELL_SCHOOL_HOLY:
9006 trigger_spell_id = 54370;
9007 break;
9008 case SPELL_SCHOOL_FIRE:
9009 trigger_spell_id = 54371;
9010 break;
9012 trigger_spell_id = 54375;
9013 break;
9014 case SPELL_SCHOOL_FROST:
9015 trigger_spell_id = 54372;
9016 break;
9018 trigger_spell_id = 54374;
9019 break;
9021 trigger_spell_id = 54373;
9022 break;
9023 default:
9024 return false;
9025 }
9026 }
9027 break;
9028 }
9029 case SPELLFAMILY_PRIEST:
9030 {
9031 // Blessed Recovery
9032 if (auraSpellInfo->SpellIconID == 1875)
9033 {
9034 switch (auraSpellInfo->Id)
9035 {
9036 case 27811:
9037 trigger_spell_id = 27813;
9038 break;
9039 case 27815:
9040 trigger_spell_id = 27817;
9041 break;
9042 case 27816:
9043 trigger_spell_id = 27818;
9044 break;
9045 default:
9046 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in BR", auraSpellInfo->Id);
9047 return false;
9048 }
9049 basepoints0 = CalculatePct(int32(damage), triggerAmount) / 3;
9050 target = this;
9051 // Add remaining ticks to healing done
9052 CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
9053 return true;
9054 }
9055 break;
9056 }
9057 case SPELLFAMILY_DRUID:
9058 {
9059 switch (auraSpellInfo->Id)
9060 {
9061 // Druid Forms Trinket
9062 case 37336:
9063 {
9064 switch (GetShapeshiftForm())
9065 {
9066 case FORM_NONE:
9067 trigger_spell_id = 37344;
9068 break;
9069 case FORM_CAT:
9070 trigger_spell_id = 37341;
9071 break;
9072 case FORM_BEAR:
9073 case FORM_DIREBEAR:
9074 trigger_spell_id = 37340;
9075 break;
9076 case FORM_TREE:
9077 trigger_spell_id = 37342;
9078 break;
9079 case FORM_MOONKIN:
9080 trigger_spell_id = 37343;
9081 break;
9082 default:
9083 return false;
9084 }
9085 break;
9086 }
9087 // Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred)
9088 case 67353:
9089 {
9090 switch (GetShapeshiftForm())
9091 {
9092 case FORM_CAT:
9093 trigger_spell_id = 67355;
9094 break;
9095 case FORM_BEAR:
9096 case FORM_DIREBEAR:
9097 trigger_spell_id = 67354;
9098 break;
9099 default:
9100 return false;
9101 }
9102 break;
9103 }
9104 default:
9105 break;
9106 }
9107 break;
9108 }
9109 case SPELLFAMILY_HUNTER:
9110 {
9111 if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots
9112 {
9113 if (!victim)
9114 return false;
9115
9116 switch (auraSpellInfo->Id)
9117 {
9118 case 53234: // Rank 1
9119 case 53237: // Rank 2
9120 case 53238: // Rank 3
9121 trigger_spell_id = 63468;
9122 break;
9123 default:
9124 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Piercing Shots", auraSpellInfo->Id);
9125 return false;
9126 }
9127 SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id);
9128 if (!TriggerPS)
9129 return false;
9130
9131 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].Amplitude);
9132 victim->CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
9133 return true;
9134 }
9135 // Item - Hunter T9 4P Bonus (Steady Shot)
9136 else if (auraSpellInfo->Id == 67151)
9137 {
9138 if (GetTypeId() != TYPEID_PLAYER || !ToPlayer()->GetPet())
9139 return false;
9140
9141 target = ToPlayer()->GetPet();
9142 trigger_spell_id = 68130;
9143 break;
9144 }
9145 break;
9146 }
9148 {
9149 switch (auraSpellInfo->Id)
9150 {
9151 // Soul Preserver
9152 case 60510:
9153 {
9154 switch (getClass())
9155 {
9156 case CLASS_DRUID:
9157 trigger_spell_id = 60512;
9158 break;
9159 case CLASS_PALADIN:
9160 trigger_spell_id = 60513;
9161 break;
9162 case CLASS_PRIEST:
9163 trigger_spell_id = 60514;
9164 break;
9165 case CLASS_SHAMAN:
9166 trigger_spell_id = 60515;
9167 break;
9168 }
9169
9170 target = this;
9171 break;
9172 }
9173 case 37657: // Lightning Capacitor
9174 case 54841: // Thunder Capacitor
9175 case 67712: // Item - Coliseum 25 Normal Caster Trinket
9176 case 67758: // Item - Coliseum 25 Heroic Caster Trinket
9177 {
9178 if (!victim || !victim->IsAlive() || GetTypeId() != TYPEID_PLAYER)
9179 return false;
9180
9181 uint32 stack_spell_id = 0;
9182 switch (auraSpellInfo->Id)
9183 {
9184 case 37657:
9185 stack_spell_id = 37658;
9186 trigger_spell_id = 37661;
9187 break;
9188 case 54841:
9189 stack_spell_id = 54842;
9190 trigger_spell_id = 54843;
9191 break;
9192 case 67712:
9193 stack_spell_id = 67713;
9194 trigger_spell_id = 67714;
9195 break;
9196 case 67758:
9197 stack_spell_id = 67759;
9198 trigger_spell_id = 67760;
9199 break;
9200 }
9201
9202 if (cooldown && ToPlayer()->HasSpellCooldown(stack_spell_id))
9203 {
9204 return false;
9205 }
9206
9207 CastSpell(this, stack_spell_id, true, nullptr, triggeredByAura);
9208
9209 Aura* dummy = GetAura(stack_spell_id);
9210 if (!dummy || dummy->GetStackAmount() < triggerAmount)
9211 {
9212 return false;
9213 }
9214
9215 if (cooldown)
9216 {
9217 ToPlayer()->AddSpellCooldown(stack_spell_id, 0, cooldown);
9218 }
9219 RemoveAurasDueToSpell(stack_spell_id);
9220 CastSpell(victim, trigger_spell_id, true, nullptr, triggeredByAura);
9221 return true;
9222 }
9223 default:
9224 // Illumination
9225 if (auraSpellInfo->SpellIconID == 241)
9226 {
9227 if (!procSpell)
9228 return false;
9229 // procspell is triggered spell but we need mana cost of original casted spell
9230 uint32 originalSpellId = procSpell->Id;
9231 // Holy Shock heal
9232 if (procSpell->SpellFamilyFlags[1] & 0x00010000)
9233 {
9234 switch (procSpell->Id)
9235 {
9236 case 25914:
9237 originalSpellId = 20473;
9238 break;
9239 case 25913:
9240 originalSpellId = 20929;
9241 break;
9242 case 25903:
9243 originalSpellId = 20930;
9244 break;
9245 case 27175:
9246 originalSpellId = 27174;
9247 break;
9248 case 33074:
9249 originalSpellId = 33072;
9250 break;
9251 case 48820:
9252 originalSpellId = 48824;
9253 break;
9254 case 48821:
9255 originalSpellId = 48825;
9256 break;
9257 default:
9258 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in HShock", procSpell->Id);
9259 return false;
9260 }
9261 }
9262 SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalSpellId);
9263 if (!originalSpell)
9264 {
9265 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} unknown but selected as original in Illu", originalSpellId);
9266 return false;
9267 }
9268 // percent stored in effect 1 (class scripts) base points
9269 int32 cost = int32(originalSpell->ManaCost + CalculatePct(GetCreateMana(), originalSpell->ManaCostPercentage));
9270 basepoints0 = CalculatePct(cost, auraSpellInfo->Effects[1].CalcValue());
9271 trigger_spell_id = 20272;
9272 target = this;
9273 }
9274 break;
9275 }
9276 break;
9277 }
9278 case SPELLFAMILY_SHAMAN:
9279 {
9280 // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
9281 if (auraSpellInfo->SpellFamilyFlags[0] & 0x400 && auraSpellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT))
9282 {
9283 // Do not proc off from self-casted items
9284 if (Spell const* spell = eventInfo.GetProcSpell())
9285 {
9286 if (spell->m_castItemGUID && victim->GetGUID() == GetGUID())
9287 {
9288 return false;
9289 }
9290 }
9291
9292 trigger_spell_id = sSpellMgr->GetSpellWithRank(26364, auraSpellInfo->GetRank());
9293 }
9294 // Nature's Guardian
9295 else if (auraSpellInfo->SpellIconID == 2013)
9296 {
9297 // Check health condition - should drop to less 30% (damage deal after this!)
9298 if (!HealthBelowPctDamaged(30, damage))
9299 return false;
9300
9301 if (victim && victim->IsAlive())
9302 victim->GetThreatMgr().ModifyThreatByPercent(this, -10);
9303
9304 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
9305 trigger_spell_id = 31616;
9306 target = this;
9307 }
9308 break;
9309 }
9311 {
9312 // Acclimation
9313 if (auraSpellInfo->SpellIconID == 1930)
9314 {
9315 if (!procSpell)
9316 return false;
9317 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9318 {
9320 return false; // ignore
9321 case SPELL_SCHOOL_HOLY:
9322 trigger_spell_id = 50490;
9323 break;
9324 case SPELL_SCHOOL_FIRE:
9325 trigger_spell_id = 50362;
9326 break;
9328 trigger_spell_id = 50488;
9329 break;
9330 case SPELL_SCHOOL_FROST:
9331 trigger_spell_id = 50485;
9332 break;
9334 trigger_spell_id = 50489;
9335 break;
9337 trigger_spell_id = 50486;
9338 break;
9339 default:
9340 return false;
9341 }
9342 }
9343 // Blood Presence (Improved)
9344 else if (auraSpellInfo->Id == 63611)
9345 {
9346 if (GetTypeId() != TYPEID_PLAYER)
9347 return false;
9348
9349 trigger_spell_id = 50475;
9350 basepoints0 = CalculatePct(int32(damage), triggerAmount);
9351 }
9352 break;
9353 }
9354 }
9355 }
9356
9357 // All ok. Check current trigger spell
9358 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
9359 if (!triggerEntry)
9360 {
9361 // Don't cast unknown spell
9362 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} (effIndex: {}) has unknown TriggerSpell {}. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id);
9363 return false;
9364 }
9365
9366 // not allow proc extra attack spell at extra attack
9367 if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
9368 {
9369 uint32 lastExtraAttackSpell = eventInfo.GetActor()->GetLastExtraAttackSpell();
9370
9371 // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves
9372 if (lastExtraAttackSpell == trigger_spell_id)
9373 {
9374 return false;
9375 }
9376
9377 // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks
9378 // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue)
9379 if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH)
9380 {
9381 return false;
9382 }
9383 }
9384
9385 // Custom requirements (not listed in procEx) Warning! damage dealing after this
9386 // Custom triggered spells
9387 switch (auraSpellInfo->Id)
9388 {
9389 // Deep Wounds
9390 case 12834:
9391 case 12849:
9392 case 12867:
9393 {
9394 if (GetTypeId() != TYPEID_PLAYER)
9395 return false;
9396
9397 if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK)
9399 else
9401 break;
9402 }
9403 // Persistent Shield (Scarab Brooch trinket)
9404 // This spell originally trigger 13567 - Dummy Trigger (vs dummy efect)
9405 case 26467:
9406 {
9407 basepoints0 = int32(CalculatePct(damage, 15));
9408 target = victim;
9409 trigger_spell_id = 26470;
9410 break;
9411 }
9412 // Unyielding Knights (item exploit 29108\29109)
9413 case 38164:
9414 {
9415 if (!victim || victim->GetEntry() != 19457) // Proc only if your target is Grillok
9416 return false;
9417 break;
9418 }
9419 // Deflection
9420 case 52420:
9421 {
9422 if (!HealthBelowPct(35))
9423 return false;
9424 break;
9425 }
9426
9427 // Cheat Death
9428 case 28845:
9429 {
9430 // When your health drops below 20%
9431 if (HealthBelowPctDamaged(20, damage) || HealthBelowPct(20))
9432 return false;
9433 break;
9434 }
9435 // Deadly Swiftness (Rank 1)
9436 case 31255:
9437 {
9438 // whenever you deal damage to a target who is below 20% health.
9439 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(20))
9440 return false;
9441
9442 target = this;
9443 trigger_spell_id = 22588;
9444 [[fallthrough]];
9445 }
9446 // Bonus Healing (Crystal Spire of Karabor mace)
9447 case 40971:
9448 {
9449 // If your target is below $s1% health
9450 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(triggerAmount))
9451 return false;
9452 break;
9453 }
9454 // Rapid Recuperation
9455 case 53228:
9456 case 53232:
9457 {
9458 // This effect only from Rapid Fire (ability cast)
9459 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x20))
9460 return false;
9461 break;
9462 }
9463 // Decimation
9464 case 63156:
9465 case 63158:
9466 // Can proc only if target has hp below 35%
9467 if (!victim || !victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, procSpell, this))
9468 return false;
9469 break;
9470 // Ulduar, Hodir, Toasty Fire
9471 case 62821:
9472 if (this->GetTypeId() != TYPEID_PLAYER) // spell has Attribute, but persistent area auras ignore it
9473 return false;
9474 break;
9475 case 15337: // Improved Spirit Tap (Rank 1)
9476 case 15338: // Improved Spirit Tap (Rank 2)
9477 {
9478 if (!procSpell)
9479 return false;
9480
9481 if (procSpell->SpellFamilyFlags[0] & 0x800000)
9482 if ((procSpell->Id != 58381) || !roll_chance_i(50))
9483 return false;
9484
9485 target = victim;
9486 break;
9487 }
9488 // Professor Putricide - Ooze Spell Tank Protection
9489 case 71770:
9490 if (victim)
9491 victim->CastSpell(victim, trigger_spell_id, true); // EffectImplicitTarget is self
9492 return true;
9493 case 45057: // Evasive Maneuvers (Commendation of Kael`thas trinket)
9494 case 71634: // Item - Icecrown 25 Normal Tank Trinket 1
9495 case 71640: // Item - Icecrown 25 Heroic Tank Trinket 1
9496 case 75475: // Item - Chamber of Aspects 25 Normal Tank Trinket
9497 case 75481: // Item - Chamber of Aspects 25 Heroic Tank Trinket
9498 {
9499 // Procs only if damage takes health below $s1%
9500 if (!HealthBelowPctDamaged(triggerAmount, damage))
9501 return false;
9502 break;
9503 }
9504 default:
9505 break;
9506 }
9507
9508 if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
9509 {
9510 // Xinef: keep this order, Aura 70656 has SpellIconID 85!
9511 // Item - Death Knight T10 Melee 4P Bonus
9512 if (auraSpellInfo->Id == 70656)
9513 {
9515 return false;
9516
9517 for (uint8 i = 0; i < MAX_RUNES; ++i)
9518 if (ToPlayer()->GetRuneCooldown(i) == 0)
9519 return false;
9520 }
9521 // Blade Barrier
9522 else if (auraSpellInfo->SpellIconID == 85)
9523 {
9524 Player* plr = ToPlayer();
9525 if (!plr || !plr->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) || !procSpell)
9526 return false;
9527
9529 return false;
9530 }
9531 // Rime
9532 else if (auraSpellInfo->SpellIconID == 56)
9533 {
9534 if (GetTypeId() != TYPEID_PLAYER)
9535 return false;
9536
9537 // Howling Blast
9539 }
9540 }
9541
9542 // Custom basepoints/target for exist spell
9543 // dummy basepoints or other customs
9544 switch (trigger_spell_id)
9545 {
9546 // Auras which should proc on area aura source (caster in this case):
9547 // Turn the Tables
9548 case 52914:
9549 case 52915:
9550 case 52910:
9551 // Honor Among Thieves
9552 case 51699:
9553 {
9554 target = triggeredByAura->GetBase()->GetCaster();
9555 if (!target)
9556 return false;
9557
9558 if (Player* pTarget = target->ToPlayer())
9559 {
9560 if (cooldown)
9561 {
9562 if (pTarget->HasSpellCooldown(trigger_spell_id) )
9563 return false;
9564 pTarget->AddSpellCooldown(trigger_spell_id, 0, cooldown);
9565 }
9566
9567 Unit* cptarget = nullptr;
9568 if (trigger_spell_id == 51699)
9569 {
9570 cptarget = pTarget->GetComboTarget();
9571 if (!cptarget)
9572 {
9573 cptarget = pTarget->GetSelectedUnit();
9574 }
9575 }
9576 else
9577 cptarget = target;
9578
9579 if (cptarget)
9580 {
9581 target->CastSpell(cptarget, trigger_spell_id, true);
9582 return true;
9583 }
9584 }
9585 return false;
9586 }
9587 // Cast positive spell on enemy target
9588 case 7099: // Curse of Mending
9589 case 39703: // Curse of Mending
9590 case 20233: // Improved Lay on Hands (cast on target)
9591 {
9592 target = victim;
9593 break;
9594 }
9595 // Ruby Drake, Evasive Aura
9596 case 50241:
9597 {
9598 if( GetAura(50240) )
9599 return false;
9600
9601 break;
9602 }
9603 // Combo points add triggers (need add combopoint only for main target, and after possible combopoints reset)
9604 case 15250: // Rogue Setup
9605 {
9606 // applied only for main target
9607 if (!victim || (IsPlayer() && victim != ToPlayer()->GetSelectedUnit()))
9608 return false;
9609 break; // continue normal case
9610 }
9611 // Finish movies that add combo
9612 case 14189: // Seal Fate (Netherblade set)
9613 case 14157: // Ruthlessness
9614 {
9615 victim = nullptr;
9616 // Need add combopoint AFTER finish movie (or they dropped in finish phase)
9617 break;
9618 }
9619 // Item - Druid T10 Balance 2P Bonus
9620 case 16870:
9621 {
9622 if (HasAura(70718))
9623 CastSpell(this, 70721, true);
9624 RemoveAurasDueToSpell(trigger_spell_id);
9625 break;
9626 }
9627 // Shamanistic Rage triggered spell
9628 case 30824:
9629 {
9630 basepoints0 = int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), triggerAmount));
9631 break;
9632 }
9633 // Enlightenment (trigger only from mana cost spells)
9634 case 35095:
9635 {
9636 if (!procSpell || procSpell->PowerType != POWER_MANA || (procSpell->ManaCost == 0 && procSpell->ManaCostPercentage == 0 && procSpell->ManaCostPerlevel == 0))
9637 return false;
9638 break;
9639 }
9640 case 46916: // Slam! (Bloodsurge proc)
9641 case 52437: // Sudden Death
9642 {
9643 // Item - Warrior T10 Melee 4P Bonus
9644 if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
9645 {
9646 if (!roll_chance_i(aurEff->GetAmount()))
9647 {
9648 // Xinef: dont allow normal proc to override set one
9649 if (GetAura((trigger_spell_id == 46916) ? 71072 : 71069))
9650 return false;
9651 // Xinef: just to be sure
9652 RemoveAurasDueToSpell(70849);
9653 break;
9654 }
9655
9656 // Xinef: fully remove all auras and reapply once more
9657 RemoveAurasDueToSpell(70849);
9658 RemoveAurasDueToSpell(71072);
9659 RemoveAurasDueToSpell(71069);
9660
9661 CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
9662 if (trigger_spell_id == 46916)
9663 CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
9664 else
9665 CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
9666 }
9667 break;
9668 }
9669 // Sword and Board
9670 case 50227:
9671 {
9672 // Remove cooldown on Shield Slam
9673 if (IsPlayer())
9675 break;
9676 }
9677 // Maelstrom Weapon
9678 case 53817:
9679 {
9680 // have rank dependent proc chance, ignore too often cases
9681 // PPM = 2.5 * (rank of talent),
9682 uint32 rank = auraSpellInfo->GetRank();
9683 // 5 rank -> 100% 4 rank -> 80% and etc from full rate
9684 if (!roll_chance_i(20 * rank))
9685 return false;
9686
9687 // Item - Shaman T10 Enhancement 4P Bonus
9688 if (AuraEffect const* aurEff = GetAuraEffect(70832, 0))
9689 if (Aura const* maelstrom = GetAura(53817))
9690 // xinef: we have 4 charges and all proc conditions are met - aura reaches 5 charges
9691 if ((maelstrom->GetStackAmount() == 4) && roll_chance_i(aurEff->GetAmount()))
9692 CastSpell(this, 70831, true, castItem, triggeredByAura);
9693
9694 break;
9695 }
9696 // Astral Shift
9697 case 52179:
9698 {
9699 if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
9700 return false;
9701
9702 // Need stun, fear or silence mechanic
9703 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_SILENCE) | (1 << MECHANIC_STUN) | (1 << MECHANIC_FEAR))))
9704 return false;
9705 break;
9706 }
9707 // Glyph of Death's Embrace
9708 case 58679:
9709 {
9710 // Proc only from healing part of Death Coil. Check is essential as all Death Coil spells have 0x2000 mask in SpellFamilyFlags
9711 if (!procSpell || !(procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && procSpell->SpellFamilyFlags[0] == 0x80002000))
9712 return false;
9713 break;
9714 }
9715 // Glyph of Death Grip
9716 case 58628:
9717 {
9718 // remove cooldown of Death Grip
9719 if (IsPlayer())
9720 ToPlayer()->RemoveSpellCooldown(49576, true);
9721 return true;
9722 }
9723 // Savage Defense
9724 case 62606:
9725 {
9726 basepoints0 = CalculatePct(triggerAmount, GetTotalAttackPowerValue(BASE_ATTACK));
9727 break;
9728 }
9729 // Body and Soul
9730 case 64128:
9731 case 65081:
9732 {
9733 // Proc only from PW:S cast
9734 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x00000001))
9735 return false;
9736 break;
9737 }
9738 // Culling the Herd
9739 case 70893:
9740 {
9741 if (!procSpell)
9742 {
9743 return false;
9744 }
9745 // check if we're doing a critical hit
9746 if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT))
9747 return false;
9748 // check if we're procced by Claw, Bite or Smack (need to use the spell icon ID to detect it)
9749 if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473))
9750 return false;
9751 break;
9752 }
9753 // Fingers of Frost, synchronise with Frostbite
9754 case 44544:
9755 {
9756 if (procPhase == PROC_SPELL_PHASE_HIT)
9757 {
9758 // Find Frostbite
9760 {
9761 if (!victim)
9762 return false;
9763
9764 uint8 fofRank = sSpellMgr->GetSpellRank(triggeredByAura->GetId());
9765 uint8 fbRank = sSpellMgr->GetSpellRank(aurEff->GetId());
9766 uint8 chance = uint8(std::ceil(fofRank * fbRank * 16.6f));
9767
9768 if (roll_chance_i(chance))
9769 CastSpell(victim, aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true);
9770 }
9771 }
9772 break;
9773 }
9774 }
9775
9776 // try detect target manually if not set
9777 if (!target)
9778 target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
9779
9780 if (cooldown)
9781 {
9782 if (HasSpellCooldown(triggerEntry->Id))
9783 return false;
9784
9785 AddSpellCooldown(triggerEntry->Id, 0, cooldown);
9786 }
9787
9788 if(basepoints0)
9789 CastCustomSpell(target, triggerEntry->Id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
9790 else
9791 CastSpell(target, triggerEntry->Id, true, castItem, triggeredByAura);
9792
9793 return true;
9794}
@ FORM_MOONKIN
Definition: UnitDefines.h:98
@ FORM_NONE
Definition: UnitDefines.h:69
@ FORM_TREE
Definition: UnitDefines.h:71
#define SUMMON_SLOT_MINIPET
Definition: Unit.h:599
@ SPELL_HACK_AND_SLASH
Definition: Unit.h:292
@ SPELL_SWORD_SPECIALIZATION
Definition: Unit.h:291
@ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
Definition: SpellAuraDefines.h:294
@ SPELL_AURA_ADD_TARGET_TRIGGER
Definition: SpellAuraDefines.h:172
@ PROC_SPELL_PHASE_HIT
Definition: SpellMgr.h:244
@ SPELL_EFFECT_ADD_EXTRA_ATTACKS
Definition: SharedDefines.h:797
@ SPELL_ATTR1_NO_THREAT
Definition: SharedDefines.h:429
@ MECHANIC_FEAR
Definition: SharedDefines.h:1330
@ MECHANIC_SILENCE
Definition: SharedDefines.h:1334
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition: SharedDefines.h:1305
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:213
void ModifyThreatByPercent(Unit *victim, int32 percent)
Definition: ThreatMgr.cpp:508
bool HasMechanicTemplateImmunity(uint32 mask) const
Definition: Creature.cpp:2201
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition: Player.cpp:13427
void RemoveCategoryCooldown(uint32 cat)
Definition: Player.cpp:3510
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition: Player.cpp:1279
Spell const * GetProcSpell() const
Definition: Unit.h:448
Unit * GetActor()
Definition: Unit.h:439
bool HealthAbovePct(int32 pct) const
Definition: Unit.h:787
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition: Unit.cpp:15341
uint32 GetLastExtraAttackSpell() const
Definition: Unit.h:914
uint32 GetCreateHealth() const
Definition: Unit.h:1381
Unit * GetComboTarget() const
Definition: Unit.h:1634
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:786
uint8 GetRank() const
Definition: SpellInfo.cpp:2493
uint32 ManaCostPercentage
Definition: SpellInfo.h:367
bool HasEffect(SpellEffects effect) const
Definition: SpellInfo.cpp:875
uint32 ManaCost
Definition: SpellInfo.h:363

References Player::AddSpellCooldown(), AddSpellCooldown(), AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, CalculatePct(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_PRIEST, CLASS_SHAMAN, CountPctFromMaxHealth(), EFFECT_0, SpellInfo::Effects, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, FORM_NONE, FORM_TREE, ProcEventInfo::GetActor(), SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), GetAura(), GetAuraEffect(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), Aura::GetCaster(), Aura::GetCastItemGUID(), getClass(), GetComboTarget(), GetCreateHealth(), GetCreateMana(), ObjectAccessor::GetCreature(), AuraEffect::GetEffIndex(), Object::GetEntry(), GetFirstSchoolInMask(), Object::GetFloatValue(), Object::GetGUID(), AuraEffect::GetId(), Player::GetItemByGuid(), GetLastExtraAttackSpell(), SpellInfo::GetMaxDuration(), Player::GetPet(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), SpellInfo::GetSchoolMask(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Aura::GetStackAmount(), GetStat(), GetThreatMgr(), GetTotalAttackPowerValue(), Object::GetTypeId(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), SpellInfo::HasEffect(), Creature::HasMechanicTemplateImmunity(), HasSpellCooldown(), HealthAbovePct(), HealthBelowPct(), HealthBelowPctDamaged(), SpellInfo::Id, IsAlive(), Player::IsBaseRuneSlotsOnCooldown(), Player::IsClass(), IsClass(), Object::IsPlayer(), SpellInfo::IsPositive(), LOG_ERROR, m_SummonSlot, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, SpellInfo::ManaCostPerlevel, MAX_RUNES, MECHANIC_FEAR, MECHANIC_SILENCE, MECHANIC_STUN, ThreatMgr::ModifyThreatByPercent(), POWER_MANA, SpellInfo::PowerType, PROC_EX_CRITICAL_HIT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, PROC_SPELL_PHASE_HIT, RemoveAurasDueToSpell(), Player::RemoveCategoryCooldown(), Player::RemoveSpellCooldown(), roll_chance_i(), RUNE_BLOOD, SPELL_ATTR1_NO_THREAT, SPELL_AURA_ADD_TARGET_TRIGGER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_EFFECT_ADD_EXTRA_ATTACKS, SPELL_HACK_AND_SLASH, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, SPELL_SWORD_SPECIALIZATION, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sSpellMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STRENGTH, SUMMON_SLOT_MINIPET, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MINDAMAGE, and UNIT_FIELD_MINOFFHANDDAMAGE.

Referenced by ProcDamageAndSpellFor().

◆ HandleSafeUnitPointersOnDelete()

void Unit::HandleSafeUnitPointersOnDelete ( Unit thisUnit)
static
4288{
4289 if (thisUnit->SafeUnitPointerSet.empty())
4290 return;
4291 for (std::set<SafeUnitPointer*>::iterator itr = thisUnit->SafeUnitPointerSet.begin(); itr != thisUnit->SafeUnitPointerSet.end(); ++itr)
4292 (*itr)->UnitDeleted();
4293
4294 thisUnit->SafeUnitPointerSet.clear();
4295}

References SafeUnitPointerSet.

Referenced by ~Unit().

◆ HandleSpellClick()

bool Unit::HandleSpellClick ( Unit clicker,
int8  seatId = -1 
)

First check simple relations from clicker to clickee

Check database conditions

19448{
19449 Creature* creature = ToCreature();
19450 if (creature && creature->IsAIEnabled)
19451 {
19452 if (!creature->AI()->BeforeSpellClick(clicker))
19453 {
19454 return false;
19455 }
19456 }
19457
19458 bool result = false;
19459 uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry();
19460 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
19461 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
19462 {
19464 if (!itr->second.IsFitToRequirements(clicker, this))
19465 continue;
19466
19468 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(spellClickEntry, itr->second.spellId);
19469 ConditionSourceInfo info = ConditionSourceInfo(clicker, this);
19470 if (!sConditionMgr->IsObjectMeetToConditions(info, conds))
19471 continue;
19472
19473 Unit* caster = (itr->second.castFlags & NPC_CLICK_CAST_CASTER_CLICKER) ? clicker : this;
19474 Unit* target = (itr->second.castFlags & NPC_CLICK_CAST_TARGET_CLICKER) ? clicker : this;
19475 ObjectGuid origCasterGUID = (itr->second.castFlags & NPC_CLICK_CAST_ORIG_CASTER_OWNER) ? GetOwnerGUID() : clicker->GetGUID();
19476
19477 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->second.spellId);
19478
19479 // xinef: dont allow players to enter vehicles on arena
19480 if (spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && caster->IsPlayer() && caster->FindMap() && caster->FindMap()->IsBattleArena())
19481 continue;
19482
19483 if (seatId > -1)
19484 {
19485 uint8 i = 0;
19486 bool valid = false;
19487 while (i < MAX_SPELL_EFFECTS)
19488 {
19489 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE)
19490 {
19491 valid = true;
19492 break;
19493 }
19494 ++i;
19495 }
19496
19497 if (!valid)
19498 {
19499 LOG_ERROR("sql.sql", "Spell {} specified in npc_spellclick_spells is not a valid vehicle enter aura!", itr->second.spellId);
19500 continue;
19501 }
19502
19503 if (IsInMap(caster))
19504 caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0 + i), seatId + 1, target, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19505 else // This can happen during Player::_LoadAuras
19506 {
19508 for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
19509 bp0[j] = spellInfo->Effects[j].BasePoints;
19510
19511 bp0[i] = seatId;
19512 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, bp0, nullptr, origCasterGUID);
19513 }
19514 }
19515 else
19516 {
19517 if (IsInMap(caster))
19518 caster->CastSpell(target, spellInfo, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19519 else
19520 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, nullptr, nullptr, origCasterGUID);
19521 }
19522
19523 result = true;
19524 }
19525
19526 if (creature && creature->IsAIEnabled)
19527 creature->AI()->OnSpellClick(clicker, result);
19528
19529 return result;
19530}
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition: ObjectMgr.h:409
SpellValueMod
Definition: SpellDefines.h:113
#define sConditionMgr
Definition: ConditionMgr.h:289
std::list< Condition * > ConditionList
Definition: ConditionMgr.h:236
@ NPC_CLICK_CAST_TARGET_CLICKER
Definition: SharedDefines.h:691
@ NPC_CLICK_CAST_ORIG_CASTER_OWNER
Definition: SharedDefines.h:692
@ NPC_CLICK_CAST_CASTER_CLICKER
Definition: SharedDefines.h:690
virtual void OnSpellClick(Unit *, bool &)
Definition: CreatureAI.h:202
virtual bool BeforeSpellClick(Unit *)
Definition: CreatureAI.h:200
Definition: ConditionMgr.h:181
Map * FindMap() const
Definition: Object.h:530
uint32 GetCreatureEntry() const
Definition: Vehicle.h:39
bool IsBattleArena() const
Definition: Map.h:455
bool HasAura(AuraType aura) const
Definition: SpellInfo.cpp:892

References Creature::AI(), CreatureAI::BeforeSpellClick(), CastCustomSpell(), CastSpell(), SpellInfo::Effects, WorldObject::FindMap(), Vehicle::GetCreatureEntry(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), GetVehicleKit(), SpellInfo::HasAura(), IsAIEnabled, Map::IsBattleArena(), WorldObject::IsInMap(), Object::IsPlayer(), LOG_ERROR, MAX_EFFECT_MASK, MAX_SPELL_EFFECTS, NPC_CLICK_CAST_CASTER_CLICKER, NPC_CLICK_CAST_ORIG_CASTER_OWNER, NPC_CLICK_CAST_TARGET_CLICKER, CreatureAI::OnSpellClick(), sConditionMgr, sObjectMgr, SPELL_AURA_CONTROL_VEHICLE, SPELLVALUE_BASE_POINT0, sSpellMgr, Object::ToCreature(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, TRIGGERED_NONE, and Aura::TryRefreshStackOrCreate().

Referenced by boss_xt002::boss_xt002AI::AttachHeart(), boss_kologarn::boss_kologarnAI::AttachLeftArm(), boss_kologarn::boss_kologarnAI::AttachRightArm(), WorldSession::HandleSpellClick(), Vehicle::InstallAccessory(), and npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI().

◆ HandleStatModifier()

bool Unit::HandleStatModifier ( UnitMods  unitMod,
UnitModifierType  modifierType,
float  amount,
bool  apply 
)
15117{
15118 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15119 {
15120 LOG_ERROR("entities.unit", "ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
15121 return false;
15122 }
15123
15124 switch (modifierType)
15125 {
15126 case BASE_VALUE:
15127 case TOTAL_VALUE:
15128 m_auraModifiersGroup[unitMod][modifierType] += apply ? amount : -amount;
15129 break;
15130 case BASE_PCT:
15131 case TOTAL_PCT:
15132 ApplyPercentModFloatVar(m_auraModifiersGroup[unitMod][modifierType], amount, apply);
15133 break;
15134 default:
15135 break;
15136 }
15137
15138 if (!CanModifyStats())
15139 return false;
15140
15141 switch (unitMod)
15142 {
15149 break;
15150
15151 case UNIT_MOD_ARMOR:
15152 UpdateArmor();
15153 break;
15154 case UNIT_MOD_HEALTH:
15156 break;
15157
15158 case UNIT_MOD_MANA:
15159 case UNIT_MOD_RAGE:
15160 case UNIT_MOD_FOCUS:
15161 case UNIT_MOD_ENERGY:
15162 case UNIT_MOD_HAPPINESS:
15163 case UNIT_MOD_RUNE:
15166 break;
15167
15175 break;
15176
15179 break;
15182 break;
15183
15186 break;
15189 break;
15192 break;
15193
15194 default:
15195 break;
15196 }
15197
15198 return true;
15199}
@ UNIT_MOD_ARMOR
Definition: Unit.h:156
@ UNIT_MOD_ATTACK_POWER
Definition: Unit.h:163
@ UNIT_MOD_HEALTH
Definition: Unit.h:148
@ UNIT_MOD_DAMAGE_RANGED
Definition: Unit.h:167
@ UNIT_MOD_DAMAGE_MAINHAND
Definition: Unit.h:165
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition: Unit.h:164
void apply(T *val)
Definition: ByteConverter.h:40
SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15258
Stats GetStatByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15290
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
virtual void UpdateResistances(uint32 school)=0
Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const
Definition: Unit.cpp:15319
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition: StatSystem.cpp:60
virtual void UpdateArmor()=0
virtual void UpdateMaxPower(Powers power)=0
virtual bool UpdateStats(Stats stat)=0
bool CanModifyStats() const
Definition: Unit.h:1447
virtual void UpdateMaxHealth()=0

References ApplyPercentModFloatVar(), BASE_ATTACK, BASE_PCT, BASE_VALUE, CanModifyStats(), GetPowerTypeByAuraGroup(), GetSpellSchoolByAuraGroup(), GetStatByAuraGroup(), LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_END, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_RUNE, UNIT_MOD_RUNIC_POWER, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_STRENGTH, UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDamagePhysical(), UpdateMaxHealth(), UpdateMaxPower(), UpdateResistances(), and UpdateStats().

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDependentAuraDamageMod(), boss_marli::_schedulePhaseSpider(), boss_marli::_schedulePhaseTroll(), Player::ApplyEnchantment(), AuraEffect::HandleAuraIncreaseBaseHealthPercent(), AuraEffect::HandleAuraModAttackPower(), AuraEffect::HandleAuraModAttackPowerPercent(), AuraEffect::HandleAuraModBaseResistancePCT(), AuraEffect::HandleAuraModIncreaseEnergy(), AuraEffect::HandleAuraModIncreaseEnergyPercent(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), AuraEffect::HandleAuraModRangedAttackPower(), AuraEffect::HandleAuraModRangedAttackPowerPercent(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), AuraEffect::HandleModBaseResistance(), AuraEffect::HandleModDamageDone(), AuraEffect::HandleModDamagePercentDone(), AuraEffect::HandleModOffhandDamagePercent(), AuraEffect::HandleModPercentStat(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), Guardian::InitStatsForLevel(), spell_astromancer_solarian_transform::OnApply(), spell_astromancer_solarian_transform::OnRemove(), boss_arlokk::boss_arlokkAI::Reset(), boss_marli::Reset(), and boss_arlokk::boss_arlokkAI::UpdateAI().

◆ HasActivePowerType()

◆ HasAura()

bool Unit::HasAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5643{
5644 if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask))
5645 return true;
5646 return false;
5647}

References GetAuraApplication().

Referenced by boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), spell_warl_health_funnel::ApplyEffect(), boss_archavon::boss_archavonAI::AttackStart(), boss_emalon::boss_emalonAI::AttackStart(), boss_koralon::boss_koralonAI::AttackStart(), boss_toravon::boss_toravonAI::AttackStart(), boss_hodir::boss_hodirAI::CanAIAttack(), boss_razorgore::boss_razorgoreAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_jindo::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_nethermancer_sepethrea::CanAIAttack(), boss_chromaggus::boss_chromaggusAI::CanAIAttack(), npc_wg_siege_machine::npc_wg_siege_machineAI::CanControlVehicle(), Player::CanJoinToBattleground(), Player::CanResummonPet(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CastItemCombatSpell(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), Spell::CheckItems(), spell_pal_hand_of_sacrifice::CheckTarget(), SpellInfo::CheckTarget(), spell_hun_lock_and_load::CheckTrapProc(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_thekal::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), boss_kalecgos::boss_kalecgosAI::DoAction(), npc_midsummer_ribbon_pole_target::DoCleanupChecks(), Spell::DoCreateItem(), Spell::EffectDummy(), Spell::EffectHeal(), Spell::EffectInstaKill(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonPlayer(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), NPCStaveQuestAI::EvadeOnFeignDeath(), IceTombSummonEvent::Execute(), PartyTimeEmoteEvent::Execute(), spell_class_call_polymorph::FilterTargets(), spell_dru_wild_growth::FilterTargets(), spell_pri_circle_of_healing::FilterTargets(), lfg::LFGMgr::FinishDungeon(), GetDispellableAuraList(), instance_sunwell_plateau::instance_sunwell_plateau_InstanceMapScript::GetPlayerInMap(), Player::GetResurrectionSpellId(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipHello(), go_soulwell::go_soulwellAI::GossipHello(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraMounted(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), spell_thaddius_pos_neg_charge::HandleDamage(), spell_capacitus_polarity_charge::HandleDamage(), spell_mage_summon_water_elemental::HandleDummy(), spell_rog_preparation::HandleDummy(), spell_warr_charge::HandleDummy(), HandleDummyAuraProc(), spell_q12851_going_bearback::HandleEffectApply(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), Player::HandleFall(), gm_commandscript::HandleGMVisibleCommand(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), BattlefieldWG::HandleKill(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleMessagechatOpcode(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_mark_of_frost_freeze::HandleOnHit(), OPvPCapturePointZM_GraveYard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), spell_warr_vigilance::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_pal_lay_on_hands::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_q12611_deathbolt::HandleScriptEffect(), spell_dru_glyph_of_starfire::HandleScriptEffect(), misc_commandscript::HandleUnFreezeCommand(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InformCloud(), boss_taldaram::InitializeAI(), Player::IsDeserter(), SpellArea::IsFitToRequirements(), npc_anzu_spirit::IsSummonedBy(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), IsVampire(), lfg::LFGMgr::JoinLfg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), boss_sindragosa::boss_sindragosaAI::JustDied(), boss_hydross_the_unstable::JustDied(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), boss_bjarngrim::boss_bjarngrimAI::JustEngagedWith(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::JustEngagedWith(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::JustEngagedWith(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), boss_vem::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), Kill(), boss_hydross_the_unstable::KilledUnit(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Creature::LoadCreaturesAddon(), MeleeDamageBonusDone(), ModSpellCastTime(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_custodian_of_time::npc_custodian_of_timeAI::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_daranelle::npc_daranelleAI::MoveInLineOfSight(), boss_lady_vashj::MovementInform(), boss_kagani_nightstrike::MovementInform(), achievement_staying_buffed_all_winter_10::OnCheck(), achievement_staying_buffed_all_winter_25::OnCheck(), achievement_flirt_with_disaster_perf_check::OnCheck(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_aged_dying_ancient_kodo::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_innkeeper::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_orb_of_domination::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::OnPlayerAreaUpdate(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::OnPlayerEnter(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), at_karazhan_atiesh_aran::OnTrigger(), at_hor_battered_hilt_start::OnTrigger(), at_hor_battered_hilt_throw::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), at_commander_dawnforge::OnTrigger(), MidsummerPlayerScript::OnUpdateZone(), Acore::FriendlyMissingBuffInRange::operator()(), NotInStomachSelector::operator()(), SindragosaIceTombCheck::operator()(), NecroticPlagueTargetCheck::operator()(), DefaultTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), WebTargetSelector::operator()(), ShadowOfDeathSelector::operator()(), Acore::UnitAuraCheck::operator()(), SpectralBlastCheck::operator()(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Player::ReportedAfkBy(), npc_corrupted_totem::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), boss_magus_telestra::boss_magus_telestraAI::Reset(), boss_fathomlord_karathress::Reset(), npc_pet_pri_shadowfiend::Reset(), Player::RewardHonor(), RewardRage(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_jormungarAI::ScheduleEvents(), boss_supremus::SchedulePhase(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), boss_anomalus::boss_anomalusAI::SetData(), npc_thassarian2::npc_thassarian2AI::sGossipHello(), npc_chesspiece::sGossipHello(), npc_omen::npc_omenAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::SpellHit(), SpellPctDamageModsDone(), SpellTakenCritChance(), Player::StoreItem(), boss_moam::SummonedCreatureDies(), boss_apothecary_hummel::boss_apothecary_hummelAI::SummonedCreatureDies(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), npc_cyclone::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_moam::UpdateAI(), boss_ossirian::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), Player::UpdateAreaDependentAuras(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), boss_netherspite::UpdatePortals(), Player::UpdateZoneDependentAuras(), and Spell::WriteAmmoToPacket().

◆ HasAuraEffect()

bool Unit::HasAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  caster = ObjectGuid::Empty 
) const
5613{
5614 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5615 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5616 {
5617 if (itr->second->HasEffect(effIndex)
5618 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5619 {
5620 return true;
5621 }
5622 }
5623 return false;
5624}

References m_appliedAuras.

Referenced by Spell::CanAutoCast(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), spell_q12683_take_sputum_sample::HandleDummy(), AchievementCriteriaData::Meets(), and boss_headless_horseman::UpdateAI().

◆ HasAuraState()

bool Unit::HasAuraState ( AuraStateType  flag,
SpellInfo const *  spellProto = nullptr,
Unit const *  Caster = nullptr 
) const
10474{
10475 if (Caster)
10476 {
10477 if (spellProto)
10478 {
10479 AuraEffectList const& stateAuras = Caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
10480 for (AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
10481 if ((*j)->IsAffectedOnSpell(spellProto))
10482 return true;
10483 }
10484 // Check per caster aura state
10485 // If aura with aurastate by caster not found return false
10486 if ((1 << (flag - 1)) & PER_CASTER_AURA_STATE_MASK)
10487 {
10488 AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
10489 for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
10490 if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
10491 return true;
10492 return false;
10493 }
10494 }
10495
10496 return HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10497}
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
Definition: SpellAuraDefines.h:325
std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
Definition: Unit.h:644

References GetAuraEffectsByType(), Object::GetGUID(), Object::HasFlag(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, SPELL_AURA_ABILITY_IGNORE_AURASTATE, and UNIT_FIELD_AURASTATE.

Referenced by Player::_addSpell(), Pet::addSpell(), Spell::CheckCast(), spell_sha_earthliving_weapon::CheckProc(), SpellInfo::CheckTarget(), ClearAllReactives(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), isFrozen(), Player::LoadFromDB(), MeleeDamageBonusDone(), SpellPctDamageModsDone(), SpellTakenCritChance(), and UpdateReactives().

◆ HasAuraType()

bool Unit::HasAuraType ( AuraType  auraType) const
5650{
5651 return (!m_modAuras[auraType].empty());
5652}

References m_modAuras.

Referenced by ApplyTotalThreatModifier(), Attack(), Creature::CanCreatureAttack(), Player::CanTameExoticPets(), spell_q11010_q11102_q11023_q11008_check_fly_mount::CheckRequirement(), SpellInfo::CheckTarget(), Creature::DoFleeToGetAssistance(), Spell::DoSpellHitOnUnit(), Player::DurabilityPointsLoss(), Spell::EffectStuck(), Spell::EffectWeaponDmg(), npc_wild_wyrm::npc_wild_wyrmAI::EnterEvadeMode(), spell_suppression_aura::FilterTargets(), Player::GetAurasForTarget(), Player::getMaxTimer(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraAllowOnlyAbility(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraEmpathy(), AuraEffect::HandleAuraFeatherFall(), AuraEffect::HandleAuraGhost(), AuraEffect::HandleAuraHover(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModPacifyAndSilence(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModSilence(), AuraEffect::HandleAuraModStalked(), AuraEffect::HandleAuraTrackStealthed(), AuraEffect::HandleAuraUntrackable(), AuraEffect::HandleAuraWaterWalk(), AuraEffect::HandleComprehendLanguage(), AuraEffect::HandleDetectAmore(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), Player::HandleFall(), AuraEffect::HandleForceMoveForward(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModUnattackable(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandlePreventFleeing(), WorldSession::HandleRepopRequestOpcode(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), HasAuraTypeWithFamilyFlags(), HasInvisibilityAura(), HasStealthAura(), isFeared(), SpellArea::IsFitToRequirements(), IsImmunedToDamage(), IsImmunedToSchool(), IsImmunedToSpell(), IsImmunedToSpellEffect(), isInRoots(), isSpellBlocked(), Kill(), Player::KillPlayer(), KnockbackFrom(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), MagicSpellHitResult(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), LastPhaseIceTombTargetSelector::operator()(), WorldSession::ReadMovementInfo(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), Player::RewardHonor(), RollMeleeOutcomeAgainst(), PetAI::SelectNextTarget(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), SpellDamageBonusTaken(), SpellTakenCritChance(), Player::Update(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), Creature::UpdateMovementFlags(), and Player::UpdateTriggerVisibility().

◆ HasAuraTypeWithAffectMask()

bool Unit::HasAuraTypeWithAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
5683{
5684 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5685 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5686 if ((*i)->IsAffectedOnSpell(affectedSpell))
5687 return true;
5688 return false;
5689}

References GetAuraEffectsByType().

Referenced by AuraEffect::CalculatePeriodic(), Spell::DoSpellHitOnUnit(), Spell::handle_immediate(), Aura::RefreshDuration(), and Aura::RefreshTimersWithMods().

◆ HasAuraTypeWithCaster()

bool Unit::HasAuraTypeWithCaster ( AuraType  auratype,
ObjectGuid  caster 
) const
5655{
5656 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5657 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5658 if (caster == (*i)->GetCasterGUID())
5659 return true;
5660 return false;
5661}

References GetAuraEffectsByType().

Referenced by BuildValuesUpdate(), IsAlwaysDetectableFor(), PatchValuesUpdate(), and ThreatContainer::SelectNextVictim().

◆ HasAuraTypeWithFamilyFlags()

bool Unit::HasAuraTypeWithFamilyFlags ( AuraType  auraType,
uint32  familyName,
uint32  familyFlags 
) const
753{
754 if (!HasAuraType(auraType))
755 return false;
756 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
757 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
758 if (SpellInfo const* iterSpellProto = (*itr)->GetSpellInfo())
759 if (iterSpellProto->SpellFamilyName == familyName && iterSpellProto->SpellFamilyFlags[0] & familyFlags)
760 return true;
761 return false;
762}

References GetAuraEffectsByType(), and HasAuraType().

◆ HasAuraTypeWithMiscvalue()

bool Unit::HasAuraTypeWithMiscvalue ( AuraType  auratype,
int32  miscvalue 
) const
5674{
5675 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5676 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5677 if (miscvalue == (*i)->GetMiscValue())
5678 return true;
5679 return false;
5680}

References GetAuraEffectsByType().

Referenced by Player::Regenerate(), Player::UpdateManaRegen(), and Player::UpdateStats().

◆ HasAuraTypeWithTriggerSpell()

bool Unit::HasAuraTypeWithTriggerSpell ( AuraType  auratype,
uint32  triggerSpell 
) const
5701{
5702 for (AuraEffect const* aura : GetAuraEffectsByType(auratype))
5703 {
5704 if (aura->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell)
5705 {
5706 return true;
5707 }
5708 }
5709
5710 return false;
5711}

References GetAuraEffectsByType().

Referenced by WorldSession::HandlePetActionHelper().

◆ HasAuraTypeWithValue()

bool Unit::HasAuraTypeWithValue ( AuraType  auratype,
int32  value 
) const
5692{
5693 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5694 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5695 if (value == (*i)->GetAmount())
5696 return true;
5697 return false;
5698}

References GetAuraEffectsByType().

◆ HasAuraWithMechanic()

bool Unit::HasAuraWithMechanic ( uint32  mechanicMask) const
5737{
5738 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5739 {
5740 SpellInfo const* spellInfo = iter->second->GetBase()->GetSpellInfo();
5741 if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic)))
5742 return true;
5743
5744 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5745 if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic)
5746 if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic))
5747 return true;
5748 }
5749
5750 return false;
5751}

References SpellInfo::Effects, m_appliedAuras, MAX_SPELL_EFFECTS, and SpellInfo::Mechanic.

Referenced by EarthenPowerTargetSelector::operator()(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ HasBreakableByDamageAuraType()

bool Unit::HasBreakableByDamageAuraType ( AuraType  type,
uint32  excludeAura = 0 
) const
765{
766 AuraEffectList const& auras = GetAuraEffectsByType(type);
767 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
768 if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
769 ((*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
770 return true;
771 return false;
772}

References AURA_INTERRUPT_FLAG_TAKE_DAMAGE, and GetAuraEffectsByType().

Referenced by HasBreakableByDamageCrowdControlAura().

◆ HasBreakableByDamageCrowdControlAura()

bool Unit::HasBreakableByDamageCrowdControlAura ( Unit excludeCasterChannel = nullptr) const
775{
776 uint32 excludeAura = 0;
777 if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : nullptr)
778 excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
779
785}
@ SPELL_AURA_MOD_FEAR
Definition: SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition: SpellAuraDefines.h:89
@ SPELL_AURA_TRANSFORM
Definition: SpellAuraDefines.h:119
@ SPELL_AURA_MOD_CONFUSE
Definition: SpellAuraDefines.h:68
@ SPELL_AURA_MOD_STUN
Definition: SpellAuraDefines.h:75
bool HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura=0) const
Definition: Unit.cpp:764
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition: Unit.h:1403

References CURRENT_CHANNELED_SPELL, GetCurrentSpell(), HasBreakableByDamageAuraType(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, and SPELL_AURA_TRANSFORM.

Referenced by PetAI::CanAttack(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), CasterAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), and PetAI::UpdateAI().

◆ HasExtraUnitMovementFlag()

uint16 Unit::HasExtraUnitMovementFlag ( uint16  f) const
inline

◆ HasInvisibilityAura()

bool Unit::HasInvisibilityAura ( ) const
inline

◆ HasNegativeAuraWithAttribute()

bool Unit::HasNegativeAuraWithAttribute ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5726{
5727 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5728 {
5729 Aura const* aura = iter->second->GetBase();
5730 if (!iter->second->IsPositive() && aura->GetSpellInfo()->Attributes & flag && (!guid || aura->GetCasterGUID() == guid))
5731 return true;
5732 }
5733 return false;
5734}
uint32 Attributes
Definition: SpellInfo.h:324

References SpellInfo::Attributes, Aura::GetCasterGUID(), Aura::GetSpellInfo(), and m_appliedAuras.

◆ HasNegativeAuraWithInterruptFlag()

bool Unit::HasNegativeAuraWithInterruptFlag ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5714{
5715 if (!(m_interruptMask & flag))
5716 return false;
5717 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); ++iter)
5718 {
5719 if (!(*iter)->IsPositive() && (*iter)->GetBase()->GetSpellInfo()->AuraInterruptFlags & flag && (!guid || (*iter)->GetBase()->GetCasterGUID() == guid))
5720 return true;
5721 }
5722 return false;
5723}

References m_interruptableAuras, and m_interruptMask.

Referenced by ThreatContainer::SelectNextVictim().

◆ HasNpcFlag()

bool Unit::HasNpcFlag ( NPCFlags  flags) const
inline

◆ HasSharedVision()

◆ HasSpell()

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

virtual bool Unit::HasSpellItemCooldown ( uint32  ,
uint32   
) const
inlinevirtual

Reimplemented in Player.

1761{ return false; }

Referenced by Spell::CheckCast(), and ProcDamageAndSpellFor().

◆ HasStealthAura()

◆ HasUnitFlag()

bool Unit::HasUnitFlag ( UnitFlags  flags) const
inline
824{ return HasFlag(UNIT_FIELD_FLAGS, flags); }

References Object::HasFlag(), and UNIT_FIELD_FLAGS.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), Vehicle::AddPassenger(), AttackerStateUpdate(), boss_malygos::boss_malygosAI::AttackStart(), SmartAI::AttackStart(), npc_halazzi_lynx::AttackStart(), npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), violet_hold_trashAI::AttackStart(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::AttackStart(), npc_ravenous_worg::npc_ravenous_worgAI::AttackStart(), npc_swarm_scarab::npc_swarm_scarabAI::CanAIAttack(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanNoReagentCast(), CanSwim(), CanUseAttackType(), Spell::CheckEffectTarget(), boss_muru::boss_muruAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_illidan_stormrage::boss_illidan_stormrageAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_jormungarAI::DoAction(), Spell::DoSpellHitOnUnit(), RandomMovementGenerator< T >::DoUpdate(), boss_dorothee::EnterEvadeMode(), boss_roar::EnterEvadeMode(), boss_strawman::EnterEvadeMode(), boss_tinhead::EnterEvadeMode(), boss_julianne::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GetReactionTo(), GetVelocity(), spell_gen_model_visible::HandleEffectApply(), WorldSession::HandleMovementOpcodes(), spell_gen_mounted_charge::HandleScriptEffect(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsMounted(), IsPetInCombat(), isTargetableForAttack(), violet_hold_trashAI::JustEngagedWith(), boss_novos::boss_novosAI::JustSummoned(), Condition::Meets(), MotionMaster::MoveCharge(), MotionMaster::MoveChase(), MotionMaster::MoveConfused(), MotionMaster::MoveDistract(), MotionMaster::MoveFall(), MotionMaster::MoveFleeing(), MotionMaster::MoveFollow(), boss_professor_putricide::boss_professor_putricideAI::MoveInLineOfSight(), boss_palehoof::boss_palehoofAI::MoveInLineOfSight(), npc_massive_jormungar::npc_massive_jormungarAI::MoveInLineOfSight(), npc_ferocious_rhino::npc_ferocious_rhinoAI::MoveInLineOfSight(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::MoveInLineOfSight(), npc_frenzied_worgen::npc_frenzied_worgenAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_nether_drake::npc_nether_drakeAI::MoveInLineOfSight(), MotionMaster::MoveLand(), MotionMaster::MovePath(), MotionMaster::MovePoint(), MotionMaster::MoveRandom(), MotionMaster::MoveSeekAssistance(), MotionMaster::MoveSeekAssistanceDistract(), MotionMaster::MoveSplinePath(), MotionMaster::MoveTakeoff(), MotionMaster::MoveTargetedHome(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::myCanCast(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::RefreshSwimmingFlag(), ScriptedAI::SelectSpell(), Player::SetClientControl(), SetSpeed(), boss_the_lurker_below::SummonedCreatureDies(), Player::Update(), npc_onyxian_lair_guard::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_heart::npc_xt002_heartAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), npc_ravenous_worg::npc_ravenous_worgAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), and Player::UpdateTriggerVisibility().

◆ HasUnitFlag2()

◆ HasUnitMovementFlag()

◆ HasUnitState()

bool Unit::HasUnitState ( const uint32  f) const
inline
738{ return (m_state & f); }

References m_state.

Referenced by Spell::_cast(), Creature::_IsTargetAcceptable(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), AddThreat(), Attack(), AttackerStateUpdate(), FollowerAI::AttackStart(), npc_raging_spirit::npc_raging_spiritAI::AttackStart(), boss_alar::boss_alar(), boss_anetheron::boss_anetheron(), boss_anzu::boss_anzu(), boss_apothecary_hummel::boss_apothecary_hummelAI::boss_apothecary_hummelAI(), boss_archimonde::boss_archimonde(), boss_azgalor::boss_azgalor(), boss_azuregos::boss_azuregosAI::boss_azuregosAI(), boss_balinda::boss_balinda(), boss_bigbadwolf::boss_bigbadwolf(), boss_blackheart_the_inciter::boss_blackheart_the_inciter(), boss_blindeye_the_seer::boss_blindeye_the_seer(), boss_captain_skarloc::boss_captain_skarloc(), boss_curator::boss_curator(), boss_darkweaver_syth::boss_darkweaver_syth(), boss_dorothee::boss_dorothee(), boss_exarch_maladaar::boss_exarch_maladaar(), boss_fathomguard_caribdis::boss_fathomguard_caribdis(), boss_fathomguard_sharkkis::boss_fathomguard_sharkkis(), boss_fathomguard_tidalvess::boss_fathomguard_tidalvess(), boss_ghazan::boss_ghazan(), boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurse(), boss_halazzi::boss_halazzi(), boss_high_astromancer_solarian::boss_high_astromancer_solarian(), boss_high_king_maulgar::boss_high_king_maulgar(), boss_jarien::boss_jarien(), boss_kazrogal::boss_kazrogal(), boss_kelidan_the_breaker::boss_kelidan_the_breaker(), boss_kiggler_the_crazed::boss_kiggler_the_crazed(), boss_krosh_firehand::boss_krosh_firehand(), boss_lady_vashj::boss_lady_vashj(), boss_magtheridon::boss_magtheridon(), boss_maiden_of_virtue::boss_maiden_of_virtue(), boss_mekgineer_steamrigger::boss_mekgineer_steamrigger(), boss_mennu_the_betrayer::boss_mennu_the_betrayer(), boss_mor_grayhoof::boss_mor_grayhoof(), boss_moroes::boss_moroes(), boss_morogrim_tidewalker::boss_morogrim_tidewalker(), boss_murmur::boss_murmur(), boss_nazan::boss_nazan(), boss_nexusprince_shaffar::boss_nexusprince_shaffar(), boss_olm_the_summoner::boss_olm_the_summoner(), boss_omor_the_unscarred::boss_omor_the_unscarred(), boss_pandemonius::boss_pandemonius(), boss_quagmirran::boss_quagmirran(), boss_rage_winterchill::boss_rage_winterchill(), boss_roar::boss_roar(), boss_rokmar_the_crackler::boss_rokmar_the_crackler(), boss_shirrak_the_dead_watcher::boss_shirrak_the_dead_watcher(), boss_sothos::boss_sothos(), boss_strawman::boss_strawman(), boss_supremus::boss_supremus(), boss_swamplord_muselek::boss_swamplord_muselek(), boss_talon_king_ikiss::boss_talon_king_ikiss(), boss_tavarok::boss_tavarok(), boss_terestian_illhoof::boss_terestian_illhoof(), boss_the_black_stalker::boss_the_black_stalker(), boss_the_maker::boss_the_maker(), boss_tinhead::boss_tinhead(), boss_vazruden::boss_vazruden(), boss_void_reaver::boss_void_reaver(), boss_warbringer_omrogg::boss_warbringer_omrogg(), boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefist(), boss_watchkeeper_gargolmar::boss_watchkeeper_gargolmar(), BossAI::BossAI(), PathGenerator::CalculatePath(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), PetAI::CanAttack(), Player::CanEquipItem(), CanFreeMove(), Creature::CanPeriodicallyCallForAssistance(), Creature::CanStartAttack(), spell_dk_death_grip::CheckCast(), Spell::CheckCast(), Spell::CheckPetCast(), spell_warr_retaliation::CheckProc(), CreatureUnitRelocationWorker(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), DealDamage(), DealMeleeDamage(), DisableRotate(), UnitAI::DoCast(), UnitAI::DoCastAOE(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), Spell::DoSpellHitOnUnit(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), Spell::EffectDistract(), Spell::EffectKnockBack(), CritterAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Spell::finish(), Player::GetInitialVisiblePackets(), WorldSession::HandleAuctionListItems(), spell_dru_starfall_dummy::HandleDummy(), WorldSession::HandleEmoteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleMoveTeleportAck(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), AuraEffect::HandleProcTriggerDamageAuraProc(), ArenaSpectator::HandleSpectatorSpectateCommand(), boss_venoxis::InitializeAI(), isAttackingPlayer(), boss_faction_championsAI::IsCCed(), Creature::IsInEvadeMode(), IsInFlight(), IsMovementPreventedByCasting(), Creature::IsMovementPreventedByCasting(), isPossessed(), isPossessedByPlayer(), isSpellBlocked(), IsStopped(), isTargetableForAttack(), IsValidCombatTarget(), CritterAI::JustEngagedWith(), npc_coren_direbrew_sisters::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), boss_essence_of_desire::boss_essence_of_desireAI::JustEngagedWith(), PetAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), LoadHelper(), MagicSpellHitResult(), MeleeSpellHitResult(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_hunter::npc_toc_hunterAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_warrior::npc_toc_warriorAI::myCanCast(), npc_toc_dk::npc_toc_dkAI::myCanCast(), npc_toc_rogue::npc_toc_rogueAI::myCanCast(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::myCanCast(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::myCanCast(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_apothecary_baxter::npc_apothecary_baxter(), npc_batrider::npc_batrider(), npc_capernian::npc_capernian(), npc_hyjal_frost_wyrm::npc_hyjal_frost_wyrm(), npc_hyjal_gargoyle::npc_hyjal_gargoyle(), npc_hyjal_ground_trash::npc_hyjal_ground_trash(), npc_icc_spire_frostwyrm::npc_icc_spire_frostwyrm(), npc_inner_demon::npc_inner_demon(), npc_lord_sanguinar::npc_lord_sanguinar(), npc_telonicus::npc_telonicus(), npc_thaladred::npc_thaladred(), Acore::FriendlyCCedInRange::operator()(), SmartScript::ProcessAction(), RemoveCharmedBy(), boss_kormok::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), npc_ohgan::npc_ohganAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_isalien::Reset(), npc_anubisath_guardian::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_ashtongue_channeler::Reset(), RollMeleeOutcomeAgainst(), boss_faction_championsAI::SelectEnemyCaster(), Player::SetClientControl(), SetContestedPvP(), SetControlled(), Creature::SetDisableGravity(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Creature::SetHover(), SetInCombatState(), SetInFront(), SetRooted(), SetStunned(), WaypointMovementGenerator< Creature >::StartMove(), lfg::LFGMgr::TeleportPlayer(), CreatureAI::TriggerAlert(), Player::Update(), Update(), TimedFleeingMovementGenerator::Update(), boss_sartharion_dragonAI::UpdateAI(), CombatAI::UpdateAI(), CasterAI::UpdateAI(), BossAI::UpdateAI(), WorldBossAI::UpdateAI(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::UpdateAI(), ironhand_guardian::ironhand_guardianAI::UpdateAI(), boss_anubshiah::boss_anubshiahAI::UpdateAI(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::UpdateAI(), boss_eviscerator::boss_evisceratorAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_moira_bronzebeardAI::UpdateAI(), boss_high_priestess_thaurissanAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_halycon::boss_halyconAI::UpdateAI(), boss_highlord_omokk::boss_highlordomokkAI::UpdateAI(), boss_lord_valthalak::boss_lord_valthalakAI::UpdateAI(), boss_overlord_wyrmthalak::boss_overlordwyrmthalakAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_solakar_flamewreath::boss_solakar_flamewreathAI::UpdateAI(), boss_the_beast::boss_thebeastAI::UpdateAI(), boss_urok_doomhowl::boss_urok_doomhowlAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_chromaggus::boss_chromaggusAI::UpdateAI(), boss_ebonroc::boss_ebonrocAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_razorgore::boss_razorgoreAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_garr::boss_garrAI::UpdateAI(), boss_golemagg::boss_golemaggAI::UpdateAI(), npc_core_rager::npc_core_ragerAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_flamewaker_priest::npc_flamewaker_priestAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), boss_netherspite::UpdateAI(), boss_servant_quarters::UpdateAI(), npc_kilrek::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_priestess_delrissa::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_kagani_nightstrike::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_brutallus::boss_brutallusAI::UpdateAI(), boss_sacrolash::boss_sacrolashAI::UpdateAI(), boss_alythess::boss_alythessAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_muru::boss_muruAI::UpdateAI(), boss_entropius::boss_entropiusAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), boss_blight_worm::boss_blight_wormAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_gahzranka::boss_gahzrankaAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), npc_hallows_end_soh::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), boss_onyxia::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), npc_belnistrasz::npc_belnistraszAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_volazj::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), npc_rotting_frost_giant::npc_rotting_frost_giantAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_captain_arnath::npc_captain_arnathAI::UpdateAI(), npc_captain_brandon::npc_captain_brandonAI::UpdateAI(), npc_captain_grondel::npc_captain_grondelAI::UpdateAI(), npc_captain_rupert::npc_captain_rupertAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_anubrekhan::boss_anubrekhanAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razuvious_minion::boss_razuvious_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_ormorok::boss_ormorokAI::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_keleseth::boss_kelesethAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), boss_dalronn_the_controller::boss_dalronn_the_controllerAI::UpdateAI(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_exarch_maladaar::UpdateAI(), boss_nexusprince_shaffar::UpdateAI(), npc_yor::UpdateAI(), boss_anzu::UpdateAI(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_veras_darkshadow::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_doomlord_kazzak::boss_doomlordkazzakAI::UpdateAI(), boss_doomwalker::UpdateAI(), boss_leotheras_the_blind::UpdateAI(), boss_gruul::UpdateAI(), boss_the_maker::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_watchkeeper_gargolmar::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_lord_sanguinar::UpdateAI(), npc_capernian::UpdateAI(), npc_telonicus::UpdateAI(), npc_maghar_captive::npc_maghar_captiveAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), emerald_dragonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), PetAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_wg_spirit_guide::npc_wg_spirit_guideAI::UpdateAI(), Player::UpdateCharmedAI(), npc_general_andorov::UpdateEscortAI(), npc_onyx_flamecaller::npc_onyx_flamecallerAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_kurenai_captive::npc_kurenai_captiveAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), SmartAI::UpdatePath(), and SmartScript::UpdateTimer().

◆ HasUnitTypeMask()

◆ HasVisibleAuraType()

bool Unit::HasVisibleAuraType ( AuraType  auraType) const
5664{
5665 AuraEffectList const& mAuraList = GetAuraEffectsByType(auraType);
5666 for (AuraEffectList::const_iterator i = mAuraList.begin(); i != mAuraList.end(); ++i)
5667 if( (*i)->GetBase()->CanBeSentToClient() )
5668 return true;
5669
5670 return false;
5671}

References GetAuraEffectsByType().

◆ haveOffhandWeapon()

◆ HealBySpell()

int32 Unit::HealBySpell ( HealInfo healInfo,
bool  critical = false 
)
11166{
11167 uint32 heal = healInfo.GetHeal();
11168 sScriptMgr->ModifyHealReceived(this, healInfo.GetTarget(), heal, healInfo.GetSpellInfo());
11169 healInfo.SetHeal(heal);
11170
11171 // calculate heal absorb and reduce healing
11172 CalcHealAbsorb(healInfo);
11173
11174 int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
11175 healInfo.SetEffectiveHeal(gain);
11176
11177 SendHealSpellLog(healInfo, critical);
11178 return gain;
11179}
Unit * GetHealer() const
Definition: Unit.h:410
void SetHeal(uint32 amount)
Definition: Unit.h:400
void SetEffectiveHeal(uint32 amount)
Definition: Unit.h:405
static void CalcHealAbsorb(HealInfo &healInfo)
Definition: Unit.cpp:2466
static int32 DealHeal(Unit *healer, Unit *victim, uint32 addhealth)
Definition: Unit.cpp:10872
void SendHealSpellLog(HealInfo const &healInfo, bool critical=false)
Definition: Unit.cpp:11148

References CalcHealAbsorb(), DealHeal(), HealInfo::GetHeal(), HealInfo::GetHealer(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SendHealSpellLog(), HealInfo::SetEffectiveHeal(), HealInfo::SetHeal(), and sScriptMgr.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ HealthAbovePct()

◆ HealthAbovePctHealed()

bool Unit::HealthAbovePctHealed ( int32  pct,
uint32  heal 
) const
inline

◆ HealthBelowPct()

bool Unit::HealthBelowPct ( int32  pct) const
inline
785{ return GetHealth() < CountPctFromMaxHealth(pct); }

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_moira_bronzebeardAI::CastOnEmperorIfPossible(), boss_mor_grayhoof::DamageTaken(), boss_isalien::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), HandleProcTriggerSpell(), ScriptedAI::HealthBelowPct(), boss_olm_the_summoner::JustEngagedWith(), boss_grand_warlock_nethekurse::JustEngagedWith(), Player::LoadFromDB(), npc_death_knight_initiate::OnGossipHello(), SetHealth(), SpellPctHealingModsDone(), Update(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kalec::boss_kalecAI::UpdateAI(), boss_sathrovarr::boss_sathrovarrAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_anomalus::boss_anomalusAI::UpdateAI(), boss_keristrasza::boss_keristraszaAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_ormorok::boss_ormorokAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), and npc_akama_illidan::npc_akama_illidanAI::UpdateEscortAI().

◆ HealthBelowPctDamaged()

bool Unit::HealthBelowPctDamaged ( int32  pct,
uint32  damage 
) const
inline
786{ return int64(GetHealth()) - int64(damage) < int64(CountPctFromMaxHealth(pct)); }
std::int64_t int64
Definition: Define.h:102

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_mandokir::boss_mandokirAI::DamageDealt(), boss_gyth::boss_gythAI::DamageTaken(), boss_lord_valthalak::boss_lord_valthalakAI::DamageTaken(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::DamageTaken(), boss_quartermaster_zigris::DamageTaken(), boss_warmaster_voone::boss_warmastervooneAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_golemagg::boss_golemaggAI::DamageTaken(), npc_core_rager::npc_core_ragerAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_kormok::DamageTaken(), npc_batrider::DamageTaken(), npc_coren_direbrew::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_onyxia::DamageTaken(), npc_anubisath_guardian::DamageTaken(), boss_ouro::DamageTaken(), npc_anubisath_sentinel::aqsentinelAI::DamageTaken(), npc_anubisath_defender::DamageTaken(), boss_elder_nadox::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), npc_xt002_boombot::npc_xt002_boombotAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_vazruden::DamageTaken(), npc_millhouse_manastorm::npc_millhouse_manastormAI::DamageTaken(), npc_magister_aledis::DamageTaken(), BossAI::DamageTaken(), boss_buru::DamageTaken(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), boss_bug_trio::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), and HandleProcTriggerSpell().

◆ IncrDiminishing()

void Unit::IncrDiminishing ( DiminishingGroup  group)
14947{
14948 // Checking for existing in the table
14949 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
14950 {
14951 if (i->DRGroup != group)
14952 continue;
14953 if (int32(i->hitCount) < GetDiminishingReturnsMaxLevel(group))
14954 i->hitCount += 1;
14955 return;
14956 }
14958}
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
Definition: SpellMgr.cpp:265
Definition: Unit.h:272

References DIMINISHING_LEVEL_2, GetDiminishingReturnsMaxLevel(), GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ InitCharmInfo()

CharmInfo * Unit::InitCharmInfo ( )
15726{
15727 if (!m_charmInfo)
15728 m_charmInfo = new CharmInfo(this);
15729
15730 return m_charmInfo;
15731}
Definition: CharmInfo.h:125

References m_charmInfo.

Referenced by Guardian::Guardian(), Pet::Pet(), and SetCharmedBy().

◆ InitStatBuffMods()

void Unit::InitStatBuffMods ( )
inline
1372 {
1373 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + i, 0);
1374 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + i, 0);
1375 }

References STAT_STRENGTH, UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::InitStatsForLevel().

◆ InitTamedPet()

bool Unit::InitTamedPet ( Pet pet,
uint8  level,
uint32  spell_id 
)
17299{
17300 Player* player = ToPlayer();
17301 PetStable& petStable = player->GetOrInitPetStable();
17302 if (petStable.CurrentPet || petStable.GetUnslottedHunterPet())
17303 return false;
17304
17305 pet->SetCreatorGUID(GetGUID());
17306 pet->SetFaction(GetFaction());
17307 pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
17308
17309 if (IsPlayer())
17311
17312 if (!pet->InitStatsForLevel(level))
17313 {
17314 LOG_ERROR("entities.unit", "Pet::InitStatsForLevel() failed for creature (Entry: {})!", pet->GetEntry());
17315 return false;
17316 }
17317
17318 pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
17319 // this enables pet details window (Shift+P)
17320 pet->InitPetCreateSpells();
17321 pet->SetFullHealth();
17322 pet->FillPetInfo(&petStable.CurrentPet.emplace());
17323 return true;
17324}
@ UNIT_CREATED_BY_SPELL
Definition: UpdateFields.h:138
bool InitStatsForLevel(uint8 level)
Definition: Pet.cpp:1021
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition: Pet.cpp:2474
void InitPetCreateSpells()
Definition: Pet.cpp:2049
Definition: PetDefines.h:202
PetInfo const * GetUnslottedHunterPet() const
Definition: PetDefines.h:230
Optional< PetInfo > CurrentPet
Definition: PetDefines.h:225
PetStable & GetOrInitPetStable()
Definition: Player.cpp:15531
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition: CharmInfo.cpp:240
void SetFullHealth()
Definition: Unit.h:796
void SetFaction(uint32 faction)
Definition: Unit.cpp:9991
void ReplaceAllUnitFlags(UnitFlags flags)
Definition: Unit.h:827
CharmInfo * GetCharmInfo()
Definition: Unit.h:1225
void SetCreatorGUID(ObjectGuid creator)
Definition: Unit.h:1159

References PetStable::CurrentPet, Pet::FillPetInfo(), GetCharmInfo(), Object::GetEntry(), GetFaction(), Object::GetGUID(), Player::GetOrInitPetStable(), PetStable::GetUnslottedHunterPet(), Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Object::IsPlayer(), LOG_ERROR, ReplaceAllUnitFlags(), SetCreatorGUID(), SetFaction(), SetFullHealth(), CharmInfo::SetPetNumber(), SetUInt32Value(), sObjectMgr, Object::ToPlayer(), UNIT_CREATED_BY_SPELL, and UNIT_FLAG_PLAYER_CONTROLLED.

Referenced by CreateTamedPetFrom().

◆ InterruptNonMeleeSpells()

void Unit::InterruptNonMeleeSpells ( bool  withDelayed,
uint32  spellid = 0,
bool  withInstant = true,
bool  bySelf = false 
)
4088{
4089 // generic spells are interrupted if they are not finished or delayed
4090 if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id == spell_id))
4091 InterruptSpell(CURRENT_GENERIC_SPELL, withDelayed, withInstant, bySelf);
4092
4093 // autorepeat spells are interrupted if they are not finished or delayed
4094 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == spell_id))
4095 InterruptSpell(CURRENT_AUTOREPEAT_SPELL, withDelayed, withInstant, bySelf);
4096
4097 // channeled spells are interrupted if they are not finished, even if they are delayed
4098 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id == spell_id))
4099 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4100}

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, InterruptSpell(), and m_currentSpells.

Referenced by _EnterVehicle(), PetAI::_stopAttack(), Player::ActivateSpec(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), CleanupBeforeRemoveFromMap(), CombatStop(), boss_julianne::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_onyxia::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), DealDamage(), boss_leotheras_the_blind::DemonTime(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_medivh_bm::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_nazan::DoAction(), npc_ranshalla::npc_ranshallaAI::DoContinueEscort(), Spell::EffectKnockBack(), boss_leotheras_the_blind::ElfTime(), spell_dk_death_grip::HandleBaseDummy(), WorldSession::HandleCancelCastOpcode(), spell_magtheridon_shadow_grasp::HandleDummyRemove(), spell_novos_crystal_handler_death_aura::HandleEffectApply(), spell_hydross_cleansing_field_command::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLootOpcode(), WorldSession::HandlePetActionHelper(), spell_the_lich_king_jump::HandleScript(), boss_akilzon::boss_akilzonAI::HandleStormSequence(), npc_kilrek::JustEngagedWith(), boss_archimonde::JustEngagedWith(), boss_infinite_corruptor::boss_infinite_corruptorAI::JustEngagedWith(), boss_taldaram::JustEngagedWith(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_curator::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustEngagedWith(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustEngagedWith(), violet_hold_trashAI::JustEngagedWith(), PetAI::KilledUnit(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_shade_of_aran::OnPowerUpdate(), boss_jeklik::PathEndReached(), PretendToDie(), boss_alar::PretendToDie(), SmartScript::ProcessAction(), RemoveAurasWithInterruptFlags(), boss_curator::Reset(), boss_malchezaar::Reset(), boss_varos::boss_varosAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_talon_king_ikiss::Reset(), boss_high_astromancer_solarian::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), boss_the_lurker_below::SchedulerPhaseOne(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), boss_anomalus::boss_anomalusAI::SetData(), setDeathState(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), StopAttackFaction(), Player::TeleportTo(), CasterAI::UpdateAI(), TotemAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and PetAI::UpdateAI().

◆ InterruptSpell()

void Unit::InterruptSpell ( CurrentSpellTypes  spellType,
bool  withDelayed = true,
bool  withInstant = true,
bool  bySelf = false 
)
4021{
4022 //LOG_DEBUG("entities.unit", "Interrupt spell for unit {}.", GetEntry());
4023 Spell* spell = m_currentSpells[spellType];
4024 if (spell
4025 && (withDelayed || spell->getState() != SPELL_STATE_DELAYED)
4026 && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) // xinef: or spell is in casting state (channeled spells only)
4027 {
4028 // for example, do not let self-stun aura interrupt itself
4029 if (!spell->IsInterruptable())
4030 return;
4031
4032 // send autorepeat cancel message for autorepeat spells
4033 if (spellType == CURRENT_AUTOREPEAT_SPELL)
4034 if (IsPlayer())
4036
4037 if (spell->getState() != SPELL_STATE_FINISHED)
4038 spell->cancel(bySelf);
4039
4040 m_currentSpells[spellType] = nullptr;
4041 spell->SetReferencedFromCurrent(false);
4042 }
4043}
@ SPELL_STATE_DELAYED
Definition: Spell.h:228
void SendAutoRepeatCancel(Unit *target)
Definition: PlayerMisc.cpp:152
bool IsInterruptable() const
Definition: Spell.h:560
int32 GetCastTime() const
Definition: Spell.h:547
uint32 getState() const
Definition: Spell.h:482
void cancel(bool bySelf=false)
Definition: Spell.cpp:3710

References Spell::cancel(), CURRENT_AUTOREPEAT_SPELL, Spell::GetCastTime(), Spell::getState(), Spell::IsInterruptable(), Object::IsPlayer(), m_currentSpells, Player::SendAutoRepeatCancel(), Spell::SetReferencedFromCurrent(), SPELL_STATE_CASTING, SPELL_STATE_DELAYED, SPELL_STATE_FINISHED, and Object::ToPlayer().

Referenced by _UpdateAutoRepeatSpell(), Player::ActivateTaxiPathTo(), Attack(), AttackStop(), CastStop(), Spell::EffectInterruptCast(), Spell::EffectSanctuary(), AuraEffect::HandleAuraModSilence(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandleCancelAutoRepeatSpellOpcode(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleCancelChanneling(), spell_hun_scatter_shot::HandleDummy(), AuraEffect::HandleFeignDeath(), InterruptNonMeleeSpells(), SmartAI::JustEngagedWith(), Player::RemoveItemDependentAurasAndCasts(), SetCurrentCastedSpell(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_nightbane::TriggerHealthTakeOff(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ InvalidateValuesUpdateCache()

void Unit::InvalidateValuesUpdateCache ( )
inlineprivate
1905{ _valuesUpdateCache.clear(); }

References _valuesUpdateCache.

Referenced by SetUInt32Value(), and Update().

◆ IsAlive()

bool Unit::IsAlive ( ) const
inline
1150{ return (m_deathState == DeathState::Alive); };

References m_deathState.

Referenced by _CreateAuraApplication(), CreatureAI::_EnterEvadeMode(), _EnterVehicle(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::_LoadItem(), BossAI::_Reset(), WorldBossAI::_Reset(), KillRewarder::_RewardHonor(), KillRewarder::_RewardKillCredit(), KillRewarder::_RewardXP(), PetAI::_stopAttack(), AddAura(), Map::AddPlayerToMap(), HostileReference::AddThreat(), Spell::AddUnitTarget(), Attack(), PetAI::AttackedBy(), AttackerStateUpdate(), boss_freya::boss_freyaAI::boss_freyaAI(), boss_hodir::boss_hodirAI::boss_hodirAI(), boss_mimiron::boss_mimironAI::boss_mimironAI(), boss_thorim::boss_thorimAI::boss_thorimAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), Player::BuyItemFromVendorSlot(), CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj_InstanceMapScript::CallNextRajaxxLeader(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanCaptureTowerPoint(), CanHaveThreatList(), Player::CanInteractWithQuestGiver(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CanUseItem(), Player::CastItemCombatSpell(), Player::CheckAreaExploreAndOutdoor(), spell_dk_raise_ally::CheckCast(), spell_hun_check_pet_los::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), BattlegroundRV::CheckPositionForUnit(), spell_mage_focus_magic::CheckProc(), spell_dk_blood_caked_blade::CheckProc(), spell_dk_dancing_rune_weapon::CheckProc(), spell_item_necrotic_touch::CheckProc(), spell_pal_seal_of_righteousness::CheckProc(), spell_warl_siphon_life::CheckProc(), spell_putricide_mutation_init::CheckRequirementInternal(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CreatureUnitRelocationWorker(), DealDamage(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), Creature::DisappearAndDie(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_xerestrasza::npc_xerestraszaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_high_king_maulgar::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_infinite_corruptor::boss_infinite_corruptorAI::DoAction(), boss_tharon_ja::boss_tharon_jaAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::DoAllEffectOnTarget(), spell_hun_masters_call::DoCheckCast(), RandomMovementGenerator< T >::DoInitialize(), WorldSession::DoLootRelease(), WaypointMovementGenerator< Creature >::DoUpdate(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), Spell::EffectAddExtraAttacks(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectEnvironmentalDMG(), Spell::EffectFeedPet(), Spell::EffectHeal(), Spell::EffectHealMaxHealth(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), Spell::EffectHealthLeech(), Spell::EffectInstaKill(), Spell::EffectInterruptCast(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectResurrect(), Spell::EffectResurrectNew(), Spell::EffectResurrectPet(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSelfResurrect(), Spell::EffectSkinPlayerCorpse(), Spell::EffectStuck(), Spell::EffectThreat(), Spell::EffectWeaponDmg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Player::EnvironmentalDamage(), Player::EquipItem(), BattleExperienceEvent::Execute(), DelayedMovementEvent::Execute(), IceTombSummonEvent::Execute(), SACActivateEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), AssistanceMovementGenerator::Finalize(), Creature::ForcedDespawn(), CreatureGroup::FormationReset(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::GetData(), GetDebugInfo(), Player::GetInitialVisiblePackets(), FollowerAI::GetLeaderForFollower(), Player::getMaxTimer(), CreatureGroup::GetNewTargetForMember(), Player::GetNPCIfCanInteractWith(), GetPartyMembers(), npc_air_force_bots::npc_air_force_botsAI::GetSummonedGuard(), npc_wild_wyrm::npc_wild_wyrmAI::GetValidPlayer(), Pet::GivePetXP(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipSelect(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), BattlegroundEY::HandleAreaTrigger(), BattlegroundWS::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModTotalThreat(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), HandleDummyAuraProc(), WorldSession::HandleEmoteOpcode(), Player::HandleFall(), misc_commandscript::HandleFreezeCommand(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMessagechatOpcode(), AuraEffect::HandleModTaunt(), AuraEffect::HandleModTotalPercentStat(), WorldSession::HandleMovementOpcodes(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), AuraEffect::HandleObsModPowerAuraTick(), spell_yogg_saron_brain_link_aura::HandleOnEffectApply(), WorldSession::HandleOpenItemOpcode(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetAction(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandlePetStopAttack(), misc_commandscript::HandlePInfoCommand(), spell_pal_seal_of_command_aura::HandleProc(), HandleProcTriggerSpell(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleSummonResponseOpcode(), WorldSession::HandleUnstablePet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), boss_moroes::InitializeGuests(), Player::IsAtGroupRewardDistance(), Player::IsAtRecruitAFriendDistance(), Creature::IsInvisibleDueToDespawn(), Player::IsOutdoorPvPActive(), Player::IsPetNeedBeTemporaryUnsummoned(), isTargetableForAttack(), IsValidCombatTarget(), Spell::IsValidDeadOrAliveTarget(), ThreatCalcHelper::isValidProcess(), npc_kilrek::JustDied(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustDied(), boss_rajaxx::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), npc_underbat::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), boss_fathomlord_karathress::JustReachedHome(), boss_rotface::boss_rotfaceAI::JustSummoned(), Kill(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), Player::LoadCorpse(), Player::LoadFromDB(), LoadHelper(), MagicSpellHitResult(), AchievementCriteriaData::Meets(), CreatureGroup::MemberEngagingTarget(), CreatureGroup::MemberEvaded(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), boss_lord_marrowgar::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_uldaman::instance_uldaman_InstanceMapScript::OnCreatureCreate(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), instance_shadow_labyrinth::instance_shadow_labyrinth_InstanceMapScript::OnCreatureCreate(), go_palehoof_sphere::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), spell_yogg_saron_brain_link_aura::OnPeriodic(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), at_orb_of_command::OnTrigger(), at_ancient_leaf::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), SmartTrigger::OnTrigger(), AreaTrigger_at_area_52_entrance::OnTrigger(), at_dragonspire_hall::OnTrigger(), at_blackrock_stadium::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_commander_dawnforge::OnTrigger(), RisenArchmageCheck::operator()(), WretchedGhoulCleaner::operator()(), ValithriaDespawner::operator()(), Acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck::operator()(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Acore::NearestPlayerInObjectRangeCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::AnyUnitInObjectRangeCheck::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Acore::AnyDeadUnitCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::MostHPMissingGroupInRange::operator()(), FrostwingVrykulSearcher::operator()(), Acore::AllDeadCreaturesInRange::operator()(), ShadowTrapLKTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), MapMgr::PlayerCannotEnter(), ProcDamageAndSpell(), RemoveCharmedBy(), Group::RemoveMember(), Player::RemovePet(), Battleground::RemovePlayerAtLeave(), Player::RepopAtGraveyard(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_fathomlord_karathress::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), Creature::Respawn(), Player::RewardPlayerAndGroupAtEvent(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), Player::SendLoot(), npc_corrupted_totem::SetAura(), instance_naxxramas::instance_naxxramas_InstanceMapScript::SetBossState(), SetConfused(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::SetData(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::SetData(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::SetData(), boss_teron_gorefiend::SetData(), Player::setDeathState(), Creature::SetDisableGravity(), SetFeared(), Creature::SetHover(), SetInCombatState(), SetStunned(), Battlefield::ShowNpc(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::SpawnAdds(), npc_dark_iron_guzzler::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), WaypointMovementGenerator< Creature >::StartMove(), PassengerController::SummonCreatures(), boss_rend_blackhand::boss_rend_blackhandAI::SummonedCreatureDespawn(), boss_priestess_delrissa::SummonedCreatureDies(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), Player::SwapItem(), lfg::LFGMgr::TeleportPlayer(), BattlegroundRV::TeleportUnitToNewZ(), Pet::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Puppet::Update(), Player::Update(), Totem::Update(), Update(), TimedFleeingMovementGenerator::Update(), TotemAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_taldaram::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::UpdateAI(), PetAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_ringo::npc_ringoAI::UpdateFollowerAI(), InstanceScript::UpdateMinionState(), Creature::UpdateMovementFlags(), boss_netherspite::UpdatePortals(), boss_twin_valkyrAI::UpdateSharedHealth(), UpdateSplineMovement(), Player::UpdateZone(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsAlwaysDetectableFor()

bool Unit::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14130{
14132 return true;
14133
14134 if (HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, seer->GetGUID()))
14135 return true;
14136
14137 if (Player* ownerPlayer = GetSpellModOwner())
14138 if (Player const* seerPlayer = seer->ToPlayer())
14139 {
14140 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14141 return true;
14142 }
14143
14144 return false;
14145}
@ SPELL_AURA_MOD_STALKED
Definition: SpellAuraDefines.h:131
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
Definition: Object.h:664

References Object::GetGUID(), GetSpellModOwner(), HasAuraTypeWithCaster(), WorldObject::IsAlwaysDetectableFor(), SPELL_AURA_MOD_STALKED, and Object::ToPlayer().

Referenced by Creature::IsAlwaysDetectableFor(), and Player::IsAlwaysDetectableFor().

◆ IsAlwaysVisibleFor()

bool Unit::IsAlwaysVisibleFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14111{
14113 return true;
14114
14115 // Always seen by owner
14116 if (ObjectGuid guid = GetCharmerOrOwnerGUID())
14117 if (seer->GetGUID() == guid)
14118 return true;
14119
14120 if (Player const* seerPlayer = seer->ToPlayer())
14121 if (Unit* owner = GetOwner())
14122 if (Player* ownerPlayer = owner->ToPlayer())
14123 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14124 return true;
14125
14126 return false;
14127}
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
Definition: Object.h:661

References GetCharmerOrOwnerGUID(), Object::GetGUID(), GetOwner(), WorldObject::IsAlwaysVisibleFor(), and Object::ToPlayer().

◆ IsArmorer()

bool Unit::IsArmorer ( ) const
inline
@ UNIT_NPC_FLAG_REPAIR
Definition: UnitDefines.h:306
bool HasNpcFlag(NPCFlags flags) const
Definition: Unit.h:990

References HasNpcFlag(), and UNIT_NPC_FLAG_REPAIR.

◆ isAttackingPlayer()

bool Unit::isAttackingPlayer ( ) const
10392{
10394 return true;
10395
10396 if (!m_Controlled.empty())
10397 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10398 if ((*itr)->isAttackingPlayer())
10399 return true;
10400
10401 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
10402 if (m_SummonSlot[i])
10403 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
10404 if (summon->isAttackingPlayer())
10405 return true;
10406
10407 return false;
10408}

References WorldObject::GetMap(), HasUnitState(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, and UNIT_STATE_ATTACK_PLAYER.

◆ isAttackReady()

◆ IsAuctioner()

bool Unit::IsAuctioner ( ) const
inline
@ UNIT_NPC_FLAG_AUCTIONEER
Definition: UnitDefines.h:315

References HasNpcFlag(), and UNIT_NPC_FLAG_AUCTIONEER.

◆ IsBanker()

bool Unit::IsBanker ( ) const
inline
@ UNIT_NPC_FLAG_BANKER
Definition: UnitDefines.h:311

References HasNpcFlag(), and UNIT_NPC_FLAG_BANKER.

◆ IsBattleMaster()

bool Unit::IsBattleMaster ( ) const
inline

◆ isBeingLoaded()

virtual bool Unit::isBeingLoaded ( ) const
inlinevirtual

Reimplemented in Pet, and Player.

1737{ return false;}

Referenced by Player::SetMover().

◆ isBlockCritical()

bool Unit::isBlockCritical ( )
3087{
3089 return true;
3090 return false;
3091}
@ SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
Definition: SpellAuraDefines.h:316

References GetTotalAuraModifier(), roll_chance_i(), and SPELL_AURA_MOD_BLOCK_CRIT_CHANCE.

Referenced by CalculateMeleeDamage(), and CalculateSpellDamageTaken().

◆ IsCharmed()

◆ IsCharmedOwnedByPlayerOrPlayer()

bool Unit::IsCharmedOwnedByPlayerOrPlayer ( ) const
inline
ObjectGuid GetCharmerOrOwnerOrOwnGUID() const
Definition: Unit.h:1173

References GetCharmerOrOwnerOrOwnGUID(), and ObjectGuid::IsPlayer().

Referenced by Spell::DoSpellHitOnUnit(), and ProcDamageAndSpellFor().

◆ IsClass()

◆ IsContestedGuard()

bool Unit::IsContestedGuard ( ) const
inline
854 {
856 return entry->IsContestedGuardFaction();
857
858 return false;
859 }

References GetFactionTemplateEntry().

Referenced by Acore::NearestVisibleDetectableContestedGuardUnitCheck::operator()().

◆ IsControllableGuardian()

bool Unit::IsControllableGuardian ( ) const
inline

◆ IsControlledByPlayer()

◆ IsCreatedByPlayer()

bool Unit::IsCreatedByPlayer ( ) const
inline
1171{ return m_CreatedByPlayer; }

References m_CreatedByPlayer.

Referenced by DealDamage().

◆ IsCritter()

◆ IsDamageReducedByArmor()

bool Unit::IsDamageReducedByArmor ( SpellSchoolMask  damageSchoolMask,
SpellInfo const *  spellInfo = nullptr,
uint8  effIndex = MAX_SPELL_EFFECTS 
)
static
1973{
1974 // only physical spells damage gets reduced by armor
1975 if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
1976 return false;
1977 if (spellInfo)
1978 {
1979 // there are spells with no specific attribute but they have "ignores armor" in tooltip
1980 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
1981 return false;
1982
1983 // bleeding effects are not reduced by armor
1984 if (effIndex != MAX_SPELL_EFFECTS)
1985 {
1986 if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
1987 spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
1988 if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
1989 return false;
1990 }
1991 }
1992 return true;
1993}
@ SPELL_ATTR0_CU_IGNORE_ARMOR
Definition: SpellInfo.h:191
@ MECHANIC_BLEED
Definition: SharedDefines.h:1340

References SpellInfo::Effects, SpellInfo::GetEffectMechanicMask(), SpellInfo::HasAttribute(), MAX_SPELL_EFFECTS, MECHANIC_BLEED, SPELL_ATTR0_CU_IGNORE_ARMOR, SPELL_AURA_PERIODIC_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ isDead()

bool Unit::isDead ( ) const
inline
1152{ return (m_deathState == DeathState::Dead || m_deathState == DeathState::Corpse); };

References m_deathState.

Referenced by npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), Spell::EffectSummonPet(), AuraEffect::HandleAuraDummy(), Player::HandleFall(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), misc_commandscript::HandleRespawnCommand(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), Creature::HasSpellFocus(), UnitAI::InitializeAI(), SmartAI::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_spinestalker::npc_spinestalkerAI::InitializeAI(), npc_rimefang::npc_rimefangAI::InitializeAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::InitializeAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), Player::isAllowedToLoot(), npc_anubisath_sentinel::aqsentinelAI::JustDied(), Player::OnGossipSelect(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), Player::PrepareGossipMenu(), SmartScript::ProcessAction(), Player::RepopAtGraveyard(), npc_anubisath_sentinel::aqsentinelAI::Reset(), WorldSession::SendAttackStop(), SendMeleeAttackStop(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), and npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI().

◆ IsDuringRemoveFromWorld()

◆ isDying()

bool Unit::isDying ( ) const
inline
1151{ return (m_deathState == DeathState::JustDied); };

References m_deathState.

Referenced by CanHaveThreatList(), and SetHover().

◆ IsEngaged()

◆ IsEngagedBy()

bool Unit::IsEngagedBy ( Unit const *  who) const
inline
1029{ return IsInCombatWith(who); }

References IsInCombatWith().

Referenced by Creature::_IsTargetAcceptable(), and Creature::Update().

◆ IsFalling()

bool Unit::IsFalling ( ) const

◆ isFeared()

◆ IsFFAPvP()

bool Unit::IsFFAPvP ( ) const
inline

◆ IsFlying()

◆ IsFriendlyTo()

bool Unit::IsFriendlyTo ( Unit const *  unit) const
10177{
10178 return GetReactionTo(unit) >= REP_FRIENDLY;
10179}

References GetReactionTo(), and REP_FRIENDLY.

Referenced by Spell::_cast(), AuraApplication::_InitFlags(), Creature::_IsTargetAcceptable(), FollowerAI::AssistPlayerInCombatAgainst(), npc_calvin_montague::npc_calvin_montagueAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), Creature::CanAssistTo(), spell_dk_death_coil::CheckCast(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), Spell::CheckCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), Spell::EffectDispel(), Spell::EffectDispelMechanic(), Spell::EffectStealBeneficialBuff(), Spell::EffectThreat(), Aura::HandleAuraSpecificMods(), spell_dk_death_coil::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pri_penance::HandleDummy(), HandleDummyAuraProc(), BattlefieldWG::HandleKill(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), WorldSession::HandleSetSelectionOpcode(), Spell::HandleThreatSpells(), GameObject::IsAlwaysVisibleFor(), SpellClickInfo::IsFitToRequirements(), npc_draenei_survivor::npc_draenei_survivorAI::MoveInLineOfSight(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), PetSpellFail(), SmartScript::ProcessEvent(), RemoveCharmedBy(), Spell::SelectExplicitTargets(), Player::SendLoot(), Acore::MessageDistDelivererToHostile::SendPacket(), and TotemAI::UpdateAI().

◆ isFrozen()

◆ IsFullHealth()

◆ IsGossip()

bool Unit::IsGossip ( ) const
inline
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:294

References HasNpcFlag(), and UNIT_NPC_FLAG_GOSSIP.

◆ IsGuardian()

◆ IsGuildMaster()

bool Unit::IsGuildMaster ( ) const
inline
@ UNIT_NPC_FLAG_PETITIONER
Definition: UnitDefines.h:312

References HasNpcFlag(), and UNIT_NPC_FLAG_PETITIONER.

◆ IsHostileTo()

◆ IsHostileToPlayers()

bool Unit::IsHostileToPlayers ( ) const
10182{
10183 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10184 if (!my_faction || !my_faction->faction)
10185 return false;
10186
10187 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10188 if (raw_faction && raw_faction->reputationListID >= 0)
10189 return false;
10190
10191 return my_faction->IsHostileToPlayers();
10192}
int32 reputationListID
Definition: DBCStructure.h:909
uint32 faction
Definition: DBCStructure.h:941
bool IsHostileToPlayers() const
Definition: DBCStructure.h:981

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsHostileToPlayers(), FactionEntry::reputationListID, and sFactionStore.

◆ IsHovering()

◆ IsHunterPet()

◆ IsImmunedToDamage() [1/3]

bool Unit::IsImmunedToDamage ( Spell const *  spell) const
12717{
12718 SpellInfo const* spellInfo = spell->GetSpellInfo();
12719 if (!spellInfo)
12720 {
12721 return false;
12722 }
12723
12725 {
12726 return false;
12727 }
12728
12730 {
12731 return false;
12732 }
12733
12734 uint32 schoolMask = spell->GetSpellSchoolMask();
12735 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12736 {
12737 return false;
12738 }
12739
12740 // If m_immuneToDamage type contain magic, IMMUNE damage.
12741 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12742 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12743 {
12744 if ((itr->type & schoolMask) == schoolMask)
12745 {
12746 return true;
12747 }
12748 }
12749
12750 return false;
12751}
std::vector< SpellImmune > SpellImmuneList
Definition: SpellDefines.h:180
@ SPELL_ATTR2_NO_SCHOOL_IMMUNITIES
Definition: SharedDefines.h:482
@ SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS
Definition: SharedDefines.h:435
@ IMMUNITY_DAMAGE
Definition: SharedDefines.h:1397
@ SPELL_SCHOOL_MASK_NONE
Definition: SharedDefines.h:296

References Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [2/3]

bool Unit::IsImmunedToDamage ( SpellInfo const *  spellInfo) const
12685{
12686 if (!spellInfo)
12687 {
12688 return false;
12689 }
12690
12692 {
12693 return false;
12694 }
12695
12696 if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12697 {
12698 return false;
12699 }
12700
12701 uint32 schoolMask = spellInfo->GetSchoolMask();
12702 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12703 {
12704 return false;
12705 }
12706
12707 // If m_immuneToDamage type contain magic, IMMUNE damage.
12708 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12709 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12710 if((itr->type & schoolMask) == schoolMask)
12711 return true;
12712
12713 return false;
12714}

References SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [3/3]

bool Unit::IsImmunedToDamage ( SpellSchoolMask  meleeSchoolMask) const
12669{
12670 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12671 {
12672 return false;
12673 }
12674
12675 // If m_immuneToDamage type contain magic, IMMUNE damage.
12676 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12677 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12678 if((itr->type & meleeSchoolMask) == meleeSchoolMask)
12679 return true;
12680
12681 return false;
12682}

References IMMUNITY_DAMAGE, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), and IsImmunedToDamageOrSchool().

◆ IsImmunedToDamageOrSchool() [1/2]

bool Unit::IsImmunedToDamageOrSchool ( SpellInfo const *  spellInfo) const
12833{
12834 return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo);
12835}
bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12753
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition: Unit.cpp:12668

References IsImmunedToDamage(), and IsImmunedToSchool().

◆ IsImmunedToDamageOrSchool() [2/2]

◆ IsImmunedToSchool() [1/3]

bool Unit::IsImmunedToSchool ( Spell const *  spell) const
12793{
12794 SpellInfo const* spellInfo = spell->GetSpellInfo();
12796 {
12797 return false;
12798 }
12799
12800 uint32 schoolMask = spell->GetSpellSchoolMask();
12801 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12802 {
12803 return false;
12804 }
12805
12806 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12807 {
12808 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12809 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12810 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12811 {
12812 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12813 {
12814 return true;
12815 }
12816 }
12817 }
12818
12819 return false;
12820}
@ IMMUNITY_SCHOOL
Definition: SharedDefines.h:1396
bool CanPierceImmuneAura(SpellInfo const *aura) const
Definition: SpellInfo.cpp:1322

References SpellInfo::CanPierceImmuneAura(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [2/3]

bool Unit::IsImmunedToSchool ( SpellInfo const *  spellInfo) const
12770{
12772 return false;
12773
12774 uint32 schoolMask = spellInfo->GetSchoolMask();
12775 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12776 {
12777 return false;
12778 }
12779
12780 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12781 {
12782 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12783 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12784 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12785 if((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12786 return true;
12787 }
12788
12789 return false;
12790}

References SpellInfo::CanPierceImmuneAura(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [3/3]

bool Unit::IsImmunedToSchool ( SpellSchoolMask  meleeSchoolMask) const
12754{
12755 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12756 {
12757 return false;
12758 }
12759
12760 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12761 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12762 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12763 if((itr->type & meleeSchoolMask) == meleeSchoolMask)
12764 return true;
12765
12766 return false;
12767}

References IMMUNITY_SCHOOL, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), and SpellHitResult().

◆ IsImmunedToSpell()

bool Unit::IsImmunedToSpell ( SpellInfo const *  spellInfo,
Spell const *  spell = nullptr 
)
virtual

Reimplemented in Creature.

12838{
12839 if (!spellInfo)
12840 return false;
12841
12842 // Single spell immunity.
12843 SpellImmuneList const& idList = m_spellImmune[IMMUNITY_ID];
12844 for (SpellImmuneList::const_iterator itr = idList.begin(); itr != idList.end(); ++itr)
12845 if (itr->type == spellInfo->Id)
12846 return true;
12847
12848 // xinef: my special immunity, if spellid is not on this list it means npc is immune
12849 SpellImmuneList const& allowIdList = m_spellImmune[IMMUNITY_ALLOW_ID];
12850 if (!allowIdList.empty())
12851 {
12852 for (SpellImmuneList::const_iterator itr = allowIdList.begin(); itr != allowIdList.end(); ++itr)
12853 if (itr->type == spellInfo->Id)
12854 return false;
12855 return true;
12856 }
12857
12859 return false;
12860
12861 if (spellInfo->Dispel)
12862 {
12863 SpellImmuneList const& dispelList = m_spellImmune[IMMUNITY_DISPEL];
12864 for (SpellImmuneList::const_iterator itr = dispelList.begin(); itr != dispelList.end(); ++itr)
12865 if (itr->type == spellInfo->Dispel)
12866 return true;
12867 }
12868
12869 // Spells that don't have effectMechanics.
12870 if (spellInfo->Mechanic)
12871 {
12872 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
12873 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
12874 if (itr->type == spellInfo->Mechanic)
12875 return true;
12876 }
12877
12878 bool immuneToAllEffects = true;
12879 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12880 {
12881 // State/effect immunities applied by aura expect full spell immunity
12882 // Ignore effects with mechanic, they are supposed to be checked separately
12883 if (!spellInfo->Effects[i].IsEffect())
12884 continue;
12885
12886 // Xinef: if target is immune to one effect, and the spell has transform aura - it is immune to whole spell
12887 if (IsImmunedToSpellEffect(spellInfo, i))
12888 {
12889 if (spellInfo->HasAura(SPELL_AURA_TRANSFORM))
12890 return true;
12891 continue;
12892 }
12893
12894 immuneToAllEffects = false;
12895 break;
12896 }
12897 if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
12898 return true;
12899
12900 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12901 {
12902 SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();
12903 if (spell)
12904 {
12905 spellSchoolMask = spell->GetSpellSchoolMask();
12906 }
12907
12908 if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE)
12909 {
12910 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12911 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12912 {
12913 SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId);
12914 if (((itr->type & spellSchoolMask) == spellSchoolMask)
12915 && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive()
12916 && !spellInfo->CanPierceImmuneAura(immuneSpellInfo))
12917 {
12918 return true;
12919 }
12920 }
12921 }
12922 }
12923
12924 return false;
12925}
@ IMMUNITY_ALLOW_ID
Definition: SharedDefines.h:1401
@ IMMUNITY_ID
Definition: SharedDefines.h:1400
@ IMMUNITY_MECHANIC
Definition: SharedDefines.h:1399

References SpellInfo::CanPierceImmuneAura(), SpellInfo::Dispel, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasAuraType(), SpellInfo::Id, IMMUNITY_ALLOW_ID, IMMUNITY_DISPEL, IMMUNITY_ID, IMMUNITY_MECHANIC, IMMUNITY_SCHOOL, IsImmunedToSpellEffect(), SpellInfo::IsPositive(), m_spellImmune, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_AURA_TRANSFORM, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

Referenced by AddAura(), Spell::DoSpellHitOnUnit(), Creature::IsImmunedToSpell(), spell_hun_lock_and_load::IsTargetValid(), boss_talon_king_ikiss::JustEngagedWith(), boss_kiggler_the_crazed::JustEngagedWith(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), and SpellHitResult().

◆ IsImmunedToSpellEffect()

bool Unit::IsImmunedToSpellEffect ( SpellInfo const *  spellInfo,
uint32  index 
) const
virtual

Reimplemented in Creature, and Totem.

12928{
12929 if (!spellInfo || !spellInfo->Effects[index].IsEffect())
12930 return false;
12931
12932 // xinef: pet scaling auras
12933 if (spellInfo->HasAttribute(SPELL_ATTR4_OWNER_POWER_SCALING))
12934 return false;
12935
12937 return false;
12938
12939 //If m_immuneToEffect type contain this effect type, IMMUNE effect.
12940 uint32 effect = spellInfo->Effects[index].Effect;
12941 SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
12942 for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
12943 {
12944 if (itr->type == effect && (itr->spellId != 62692 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
12945 {
12946 return true;
12947 }
12948 }
12949
12950 if (uint32 mechanic = spellInfo->Effects[index].Mechanic)
12951 {
12952 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
12953 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
12954 if (itr->type == mechanic)
12955 return true;
12956 }
12957
12958 if (uint32 aura = spellInfo->Effects[index].ApplyAuraName)
12959 {
12961 for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
12962 {
12963 if (itr->type == aura && (itr->spellId != 64848 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
12964 {
12965 if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
12966 {
12967 if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling
12968 {
12969 return true;
12970 }
12971 }
12972 }
12973 }
12974
12975 if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12976 {
12977 // Check for immune to application of harmful magical effects
12979 for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
12980 {
12981 if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds?
12982 ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school
12983 !spellInfo->IsPositiveEffect(index) && // Harmful
12984 spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras
12985 {
12986 return true;
12987 }
12988 }
12989 }
12990 }
12991
12992 return false;
12993}
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
Definition: SpellAuraDefines.h:330
@ SPELL_BLOCK_TYPE_ALL
Definition: SpellDefines.h:157
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
Definition: SharedDefines.h:805
@ SPELL_ATTR3_ALWAYS_HIT
Definition: SharedDefines.h:511
@ IMMUNITY_STATE
Definition: SharedDefines.h:1395
@ IMMUNITY_EFFECT
Definition: SharedDefines.h:1394
@ SPELL_ATTR4_OWNER_POWER_SCALING
Definition: SharedDefines.h:555
bool CanRestoreMana(SpellInfo const *spellInfo) const
Definition: Unit.cpp:21095

References CanRestoreMana(), SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), IMMUNITY_EFFECT, IMMUNITY_MECHANIC, IMMUNITY_STATE, SpellInfo::IsPositive(), SpellInfo::IsPositiveEffect(), m_spellImmune, POWER_MANA, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_OWNER_POWER_SCALING, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, SPELL_AURA_SPIRIT_OF_REDEMPTION, SPELL_BLOCK_TYPE_ALL, and SPELL_EFFECT_PERSISTENT_AREA_AURA.

Referenced by AddAura(), Spell::AddUnitTarget(), Spell::DoSpellHitOnUnit(), spell_dk_death_grip::HandleBaseDummy(), IsImmunedToSpell(), and Creature::IsImmunedToSpellEffect().

◆ IsImmuneToAll()

bool Unit::IsImmuneToAll ( ) const
inline
1022{ return IsImmuneToPC() && IsImmuneToNPC(); }

References IsImmuneToNPC(), and IsImmuneToPC().

◆ IsImmuneToNPC()

◆ IsImmuneToPC()

◆ isInAccessiblePlaceFor()

bool Unit::isInAccessiblePlaceFor ( Creature const *  c) const
4152{
4153 if (c->GetMapId() == 618) // Ring of Valor
4154 {
4155 // skip transport check, check for being below floor level
4156 if (this->GetPositionZ() < 28.0f)
4157 return false;
4158 if (BattlegroundMap* bgMap = c->GetMap()->ToBattlegroundMap())
4159 if (Battleground* bg = bgMap->GetBG())
4160 if (bg->GetStartTime() < 80133) // 60000ms preparation time + 20133ms elevator rise time
4161 return false;
4162 }
4163 else if (c->GetMapId() == 631) // Icecrown Citadel
4164 {
4165 // if static transport doesn't match - return false
4166 if (c->GetTransport() != this->GetTransport() && ((c->GetTransport() && c->GetTransport()->IsStaticTransport()) || (this->GetTransport() && this->GetTransport()->IsStaticTransport())))
4167 return false;
4168
4169 // special handling for ICC (map 631), for non-flying pets in Gunship Battle, for trash npcs this is done via CanAIAttack
4170 if (c->GetOwnerGUID().IsPlayer() && !c->CanFly())
4171 {
4172 if (c->GetTransport() != this->GetTransport())
4173 return false;
4174 if (this->GetTransport())
4175 {
4176 if (c->GetPositionY() < 2033.0f)
4177 {
4178 if (this->GetPositionY() > 2033.0f)
4179 return false;
4180 }
4181 else if (c->GetPositionY() < 2438.0f)
4182 {
4183 if (this->GetPositionY() < 2033.0f || this->GetPositionY() > 2438.0f)
4184 return false;
4185 }
4186 else if (this->GetPositionY() < 2438.0f)
4187 return false;
4188 }
4189 }
4190 }
4191 else
4192 {
4193 // pussywizard: prevent any bugs by passengers exiting transports or normal creatures flying away
4194 if (c->GetTransport() != this->GetTransport())
4195 return false;
4196 }
4197
4198 LiquidStatus liquidStatus = GetLiquidData().Status;
4199 bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0;
4200
4201 // In water or jumping in water
4202 if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling()))))
4203 {
4204 return c->CanEnterWater();
4205 }
4206 else
4207 {
4208 return c->CanWalk() || c->CanFly();
4209 }
4210}
LiquidStatus
Definition: Map.h:143
@ LIQUID_MAP_ABOVE_WATER
Definition: Map.h:145
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition: Map.h:152
LiquidData const & GetLiquidData() const
Definition: Object.cpp:3174
bool IsFalling() const
Definition: Unit.cpp:19857
LiquidStatus Status
Definition: Map.h:178
BattlegroundMap * ToBattlegroundMap()
Definition: Map.h:549
Definition: Map.h:853

References Creature::CanEnterWater(), Creature::CanFly(), Creature::CanWalk(), WorldObject::GetLiquidData(), WorldObject::GetMap(), WorldLocation::GetMapId(), GetOwnerGUID(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransport(), IsFalling(), ObjectGuid::IsPlayer(), GameObject::IsStaticTransport(), LIQUID_MAP_ABOVE_WATER, MAP_LIQUID_STATUS_IN_CONTACT, LiquidData::Status, Map::ToBattlegroundMap(), and Object::ToPlayer().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), ChaseMovementGenerator< T >::DoUpdate(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), and HostileReference::updateOnlineStatus().

◆ isInBackInMap()

bool Unit::isInBackInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const

◆ IsInCombat()

bool Unit::IsInCombat ( ) const
inline

References HasUnitFlag(), and UNIT_FLAG_IN_COMBAT.

Referenced by _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), npc_anubisath_sentinel::aqsentinelAI::CallBuddiesToAttack(), npc_argent_captainAI::CanAIAttack(), Player::CanEquipItem(), Creature::CanPeriodicallyCallForAssistance(), Player::CanUnequipItem(), spell_hun_disengage::CheckCast(), Spell::CheckCast(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CombatStart(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), npc_risen_archmage::npc_risen_archmageAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoAllEffectOnTarget(), UnitAI::DoCastToAllHostilePlayers(), Spell::DoSpellHitOnUnit(), Spell::EffectActivateRune(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), Player::EquipItem(), CastRunesEvent::Execute(), GetVelocity(), spell_apothecary_lingering_fumes::HandleAfterCast(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), spell_mc_play_dead_aura::HandleEffectRemove(), WorldSession::HandleEquipmentSetUse(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), spell_putricide_mutated_transformation::HandleSummon(), WorldSession::HandleSummonResponseOpcode(), tele_commandscript::HandleTeleCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleUseItemOpcode(), npc_pet_mage_mirror_image::InitializeAI(), IsEngaged(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_anubrekhan::boss_anubrekhanAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), Pet::LoseHappiness(), CreatureGroup::MemberEvaded(), CreatureAI::MoveInLineOfSight(), boss_eye_of_cthun::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_death_knight_initiate::OnGossipHello(), npc_ulduar_expedition_commander::OnGossipHello(), go_ulduar_working_harpoon::OnGossipHello(), npc_death_knight_initiate::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), at_frozen_throne_teleport::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), RisenArchmageCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::OwnerAttackedBy(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), SmartScript::ProcessEvent(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), instance_naxxramas::instance_naxxramas_InstanceMapScript::SetBossState(), boss_grand_warlock_nethekurse::SetData(), SetInCombatState(), SetSpeed(), boss_prince_keleseth_icc::boss_prince_kelesethAI::SpellHit(), boss_prince_taldaram_icc::boss_prince_taldaramAI::SpellHit(), boss_prince_valanar_icc::boss_prince_valanarAI::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SpellHit(), Spell::SummonGuardian(), lfg::LFGMgr::TeleportPlayer(), Map::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Update(), DistractMovementGenerator::Update(), TotemAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_thekal::UpdateAI(), npc_zealot_lorkhan::UpdateAI(), npc_zealot_zath::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), boss_faction_championsAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_anubrekhan::boss_anubrekhanAI::UpdateAI(), boss_faerlina::boss_faerlinaAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), PassiveAI::UpdateAI(), PetAI::UpdateAI(), Player::UpdateContestedPvP(), Creature::UpdateEntry(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), InstanceScript::UpdateMinionState(), SmartAI::UpdatePath(), Player::UpdatePotionCooldown(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsInCombatWith()

bool Unit::IsInCombatWith ( Unit const *  who) const
20918{
20919 // Check target exists
20920 if (!who)
20921 return false;
20922 // Search in threat list
20923 ObjectGuid guid = who->GetGUID();
20924 for (ThreatContainer::StorageType::const_iterator i = m_ThreatMgr.GetThreatList().begin(); i != m_ThreatMgr.GetThreatList().end(); ++i)
20925 {
20926 HostileReference* ref = (*i);
20927 // Return true if the unit matches
20928 if (ref && ref->getUnitGuid() == guid)
20929 return true;
20930 }
20931 // Nothing found, false.
20932 return false;
20933}
Definition: ThreatMgr.h:49
ObjectGuid getUnitGuid() const
Definition: ThreatMgr.h:107
ThreatContainer::StorageType const & GetThreatList() const
Definition: ThreatMgr.h:274

References Object::GetGUID(), ThreatMgr::GetThreatList(), HostileReference::getUnitGuid(), and m_ThreatMgr.

Referenced by _IsValidAttackTarget(), DealDamage(), Spell::DoAllEffectOnTarget(), TemporaryThreatModifierEvent::Execute(), spell_herald_volzaj_insanity::HandleDummyEffect(), IsEngagedBy(), and Acore::NearestAttackableUnitInObjectRangeCheck::operator()().

◆ IsInDisallowedMountForm()

bool Unit::IsInDisallowedMountForm ( ) const
21125{
21126 if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm()))
21127 {
21128 if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
21129 {
21130 return false;
21131 }
21132 }
21133
21134 if (ShapeshiftForm form = GetShapeshiftForm())
21135 {
21136 SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(form);
21137 if (!shapeshift)
21138 {
21139 return true;
21140 }
21141
21142 if (!(shapeshift->flags1 & 0x1))
21143 {
21144 return true;
21145 }
21146 }
21147
21149 {
21150 return false;
21151 }
21152
21153 CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
21154 if (!display)
21155 {
21156 return true;
21157 }
21158
21160 if (!displayExtra)
21161 {
21162 return true;
21163 }
21164
21165 CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
21166 ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->DisplayRaceID);
21167
21168 if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT)))
21169 {
21170 if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT)))
21171 {
21172 return true;
21173 }
21174 }
21175
21176 return false;
21177}
@ CHRRACES_FLAGS_CAN_MOUNT
Definition: DBCStructure.h:675
@ CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT
Definition: DBCStructure.h:771
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
Definition: SharedDefines.h:406
uint32 getTransForm() const
Definition: Unit.h:1516
bool HasFlag(ChrRacesFlags flag) const
Definition: DBCStructure.h:700
uint32 ExtendedDisplayInfoID
Definition: DBCStructure.h:725
uint32 DisplayRaceID
Definition: DBCStructure.h:741
bool HasFlag(CreatureModelDataFlags flag) const
Definition: DBCStructure.h:804
uint32 flags1
Definition: DBCStructure.h:1822

References CHRRACES_FLAGS_CAN_MOUNT, CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT, CreatureDisplayInfoExtraEntry::DisplayRaceID, CreatureDisplayInfoEntry::ExtendedDisplayInfoID, SpellShapeshiftFormEntry::flags1, GetDisplayId(), GetNativeDisplayId(), GetShapeshiftForm(), getTransForm(), ChrRacesEntry::HasFlag(), CreatureModelDataEntry::HasFlag(), CreatureDisplayInfoEntry::ModelId, sChrRacesStore, sCreatureDisplayInfoExtraStore, sCreatureDisplayInfoStore, sCreatureModelDataStore, SPELL_ATTR0_ALLOW_WHILE_MOUNTED, sSpellMgr, and sSpellShapeshiftFormStore.

Referenced by Player::ActivateTaxiPathTo(), Spell::CheckCast(), Player::ContinueTaxiFlight(), and Player::ProcessDelayedOperations().

◆ IsInFeralForm()

bool Unit::IsInFeralForm ( ) const
inline

◆ IsInFlight()

bool Unit::IsInFlight ( ) const
inline

◆ isInFrontInMap()

bool Unit::isInFrontInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const
4142{
4143 return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
4144}

References Position::HasInArc(), and WorldObject::IsWithinDistInMap().

◆ IsInnkeeper()

bool Unit::IsInnkeeper ( ) const
inline
@ UNIT_NPC_FLAG_INNKEEPER
Definition: UnitDefines.h:310

References HasNpcFlag(), and UNIT_NPC_FLAG_INNKEEPER.

Referenced by npc_innkeeper::OnGossipHello().

◆ IsInPartyWith()

bool Unit::IsInPartyWith ( Unit const *  unit) const
18678{
18679 if (this == unit)
18680 return true;
18681
18682 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18683 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18684 if (u1 == u2)
18685 return true;
18686
18687 if (u1->IsPlayer() && u2->IsPlayer())
18688 return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
18689 // Xinef: we assume that npcs with the same faction are in party
18690 else if (u1->GetTypeId() == TYPEID_UNIT && u2->GetTypeId() == TYPEID_UNIT && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18691 return u1->GetFaction() == u2->GetFaction();
18692 // Xinef: creature type_flag should work for party check only if player group is not a raid
18695 return true;
18696 else
18697 return false;
18698}
bool IsInSameGroupWith(Player const *p) const
Definition: Player.cpp:2307
bool isRaidGroup() const
Definition: Group.cpp:2271

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Player::GetGroup(), Object::GetTypeId(), IsControlledByPlayer(), Player::IsInSameGroupWith(), Object::IsPlayer(), Group::isRaidGroup(), Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, and TYPEID_UNIT.

Referenced by SpellInfo::CheckExplicitTarget(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ IsInRaidWith()

bool Unit::IsInRaidWith ( Unit const *  unit) const
18701{
18702 if (this == unit)
18703 return true;
18704
18705 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18706 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18707 if (u1 == u2)
18708 return true;
18709
18710 if (u1->IsPlayer() && u2->IsPlayer())
18711 return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
18712 // Xinef: we assume that npcs with the same faction are in party
18713 else if (u1->GetTypeId() == TYPEID_UNIT && u2->GetTypeId() == TYPEID_UNIT && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18714 return u1->GetFaction() == u2->GetFaction();
18717 return true;
18718 else
18719 return false;
18720}

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Object::GetTypeId(), IsControlledByPlayer(), Player::IsInSameRaidWith(), Object::IsPlayer(), Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, and TYPEID_UNIT.

Referenced by Corpse::BuildValuesUpdate(), SpellInfo::CheckExplicitTarget(), GetReactionTo(), WorldSession::HandleLootMasterGiveOpcode(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), and PatchValuesUpdate().

◆ isInRoots()

bool Unit::isInRoots ( ) const
inline

◆ IsInSanctuary()

bool Unit::IsInSanctuary ( ) const
inline

◆ IsInWater()

bool Unit::IsInWater ( ) const
virtual

◆ IsLevitating()

◆ IsMounted()

◆ IsMovementPreventedByCasting()

bool Unit::IsMovementPreventedByCasting ( ) const
virtual

Reimplemented in Creature.

4118{
4119 // can always move when not casting
4121 {
4122 return false;
4123 }
4124
4125 // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute
4127 {
4128 if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive())
4129 {
4130 if (spell->GetSpellInfo()->IsActionAllowedChannel())
4131 {
4132 return false;
4133 }
4134 }
4135 }
4136
4137 // prohibit movement for all other spell casts
4138 return true;
4139}
@ UNIT_STATE_CASTING
Definition: UnitDefines.h:164

References CURRENT_CHANNELED_SPELL, HasUnitState(), m_currentSpells, SPELL_STATE_FINISHED, and UNIT_STATE_CASTING.

Referenced by TimedFleeingMovementGenerator::Update().

◆ isMoving()

◆ IsNeutralToAll()

bool Unit::IsNeutralToAll ( ) const
10195{
10196 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10197 if (!my_faction || !my_faction->faction)
10198 return true;
10199
10200 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10201 if (raw_faction && raw_faction->reputationListID >= 0)
10202 return false;
10203
10204 return my_faction->IsNeutralToAll();
10205}
bool IsNeutralToAll() const
Definition: DBCStructure.h:982

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsNeutralToAll(), FactionEntry::reputationListID, and sFactionStore.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), AggressorAI::Permissible(), and ReactorAI::Permissible().

◆ IsNonMeleeSpellCast()

bool Unit::IsNonMeleeSpellCast ( bool  withDelayed,
bool  skipChanneled = false,
bool  skipAutorepeat = false,
bool  isAutoshoot = false,
bool  skipInstant = true 
) const
4058{
4059 // We don't do loop here to explicitly show that melee spell is excluded.
4060 // Maybe later some special spells will be excluded too.
4061
4062 // generic spells are cast when they are not finished and not delayed
4065 (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
4066 {
4067 if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
4068 {
4069 if (!isAutoshoot || !m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4070 return true;
4071 }
4072 }
4073 // channeled spells may be delayed, but they are still considered cast
4074 if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
4076 {
4077 if (!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4078 return true;
4079 }
4080 // autorepeat spells may be finished or delayed, but they are still considered cast
4081 if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
4082 return true;
4083
4084 return false;
4085}
@ SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS
Definition: SharedDefines.h:473

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, m_currentSpells, SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_DELAYED, and SPELL_STATE_FINISHED.

Referenced by Spell::_cast(), _UpdateAutoRepeatSpell(), Player::ActivateSpec(), Player::ActivateTaxiPathTo(), Player::CanEquipItem(), CombatStop(), npc_mograine::npc_mograineAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), ScriptedAI::DoCastSpell(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), Spell::EffectKnockBack(), Spell::finish(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), isSpellBlocked(), boss_shade_of_aran::JustEngagedWith(), boss_pandemonius::JustEngagedWith(), MeleeSpellHitResult(), Spell::prepare(), SmartScript::ProcessEvent(), RollMeleeOutcomeAgainst(), spell_item_fetch_ball::SelectTarget(), setDeathState(), StopAttackFaction(), boss_netherspite::SwitchToPortalPhase(), Player::TeleportTo(), TotemAI::UpdateAI(), npc_chesspiece::UpdateAI(), boss_high_inquisitor_whitemane::boss_high_inquisitor_whitemaneAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_warmage_violetstand::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ IsOnVehicle()

◆ IsPet()

bool Unit::IsPet ( ) const
inline
753{ return m_unitTypeMask & UNIT_MASK_PET; }
@ UNIT_MASK_PET
Definition: UnitDefines.h:139

References m_unitTypeMask, and UNIT_MASK_PET.

Referenced by Spell::_cast(), Spell::AddUnitTarget(), spell_warl_demonic_pact_aura::AfterCheckProc(), Creature::AllLootRemovedFromCorpse(), BeforeVisibilityDestroy< Creature >(), Creature::CallAssistance(), Creature::CallForHelp(), boss_renataki::boss_renatakiAI::CanAlwaysBeDetectable(), boss_renataki::boss_renatakiAI::CanSeeAlways(), Creature::CanSwim(), ClearInCombat(), CombatStart(), Creature::CreateFromProto(), Player::CreatePet(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), DealDamage(), MotionTransport::DelayedTeleportTransport(), PetAI::DoAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectDismissPet(), Spell::EffectForceDeselect(), Spell::EffectRenamePet(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectTameCreature(), Acore::XP::Gain(), Creature::GetAggroRange(), GetCastingTimeForBonus(), GetCombatRatingReduction(), GetCreatePowers(), GetNextRandomRaidMemberOrPet(), GetRandomContactPoint(), GetVelocity(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModStat(), debug_commandscript::HandleDebugThreatListCommand(), AuraEffect::HandleFeignDeath(), modify_commandscript::HandleModifyTalentCommand(), AuraEffect::HandleModPossessPet(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcDeleteCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_commandscript::HandleNpcSetModelCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), npc_commandscript::HandleNpcTameCommand(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), pet_commandscript::HandlePetCreateCommand(), WorldSession::HandlePetRename(), WorldSession::HandlePetSetAction(), misc_commandscript::HandleRespawnCommand(), Creature::InitEntry(), TempSummon::InitStats(), Guardian::InitStatsForLevel(), DisableMgr::IsDisabledFor(), Creature::isElite(), Minion::IsGuardianPet(), Player::isHonorOrXPTarget(), Creature::isWorldBoss(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_underbat::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_murmur::JustEngagedWith(), Kill(), spell_hun_target_self_and_pet::Load(), ModSpellCastTime(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::MoveInLineOfSight(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::MoveInLineOfSight(), Acore::MostHPMissingGroupInRange::operator()(), PetAI::ReceiveEmote(), RollMeleeOutcomeAgainst(), FactorySelector::SelectAI(), Creature::SelectLevel(), WorldSession::SendPetNameQuery(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetCharm(), Creature::SetDisplayId(), SetHealth(), SetInCombatState(), SetMinion(), Creature::SetObjectScale(), setPowerType(), SpellDamageBonusDone(), SpellPctDamageModsDone(), ToPet(), TempSummon::UnSummon(), Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_hazzarah::UpdateAI(), PetAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdateAuraForGroup(), Creature::UpdateEntry(), Creature::UpdateMoveInLineOfSightState(), and UpdateSpeed().

◆ IsPetAura()

bool Unit::IsPetAura ( Aura const *  aura)
17240{
17241 Unit* owner = GetOwner();
17242
17243 if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
17244 return false;
17245
17246 // if the owner has that pet aura, return true
17247 for (PetAura const* petAura : owner->m_petAuras)
17248 if (petAura->GetAura(GetEntry()) == aura->GetId())
17249 return true;
17250
17251 return false;
17252}
Definition: SpellMgr.h:470
uint32 GetAura(uint32 petEntry) const
Definition: SpellMgr.h:486

References PetAura::GetAura(), Object::GetEntry(), Aura::GetId(), GetOwner(), Object::GetTypeId(), m_petAuras, and TYPEID_PLAYER.

Referenced by Pet::_SaveAuras(), and Spell::EffectSummonPet().

◆ IsPetInCombat()

bool Unit::IsPetInCombat ( ) const
inline

◆ IsPolymorphed()

bool Unit::IsPolymorphed ( ) const
16656{
16657 uint32 transformId = getTransForm();
16658 if (!transformId)
16659 return false;
16660
16661 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(transformId);
16662 if (!spellInfo)
16663 return false;
16664
16665 return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH;
16666}
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition: SpellInfo.h:160
SpellSpecificType GetSpellSpecific() const
Definition: SpellInfo.cpp:2136

References SpellInfo::GetSpellSpecific(), getTransForm(), SPELL_SPECIFIC_MAGE_POLYMORPH, and sSpellMgr.

Referenced by Attack(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), and Creature::Update().

◆ isPossessed()

◆ isPossessedByPlayer()

bool Unit::isPossessedByPlayer ( ) const
inline

◆ isPossessing() [1/2]

bool Unit::isPossessing ( ) const
inline
1217 {
1218 if (Unit* u = GetCharm())
1219 return u->isPossessed();
1220 else
1221 return false;
1222 }

References GetCharm().

Referenced by WorldSession::HandleCastSpellOpcode(), and misc_commandscript::HandleUnbindSightCommand().

◆ isPossessing() [2/2]

bool Unit::isPossessing ( Unit u) const
inline
1223{ return u->isPossessed() && GetCharmGUID() == u->GetGUID(); }
bool isPossessed() const
Definition: Unit.h:1214

References GetCharmGUID(), Object::GetGUID(), and isPossessed().

◆ IsPvP()

◆ IsQuestGiver()

bool Unit::IsQuestGiver ( ) const
inline
@ UNIT_NPC_FLAG_QUESTGIVER
Definition: UnitDefines.h:295

References HasNpcFlag(), and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), and npc_sayge::OnGossipHello().

◆ IsScriptOverriden()

AuraEffect * Unit::IsScriptOverriden ( SpellInfo const *  spell,
int32  script 
) const
5754{
5756 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5757 {
5758 if ((*i)->GetMiscValue() == script)
5759 if ((*i)->IsAffectedOnSpell(spell))
5760 return (*i);
5761 }
5762 return nullptr;
5763}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition: SpellAuraDefines.h:175

References GetAuraEffectsByType(), and SPELL_AURA_OVERRIDE_CLASS_SCRIPTS.

Referenced by Spell::CheckCast(), Spell::EffectWeaponDmg(), and AuraEffect::HandleAuraModShapeshift().

◆ IsServiceProvider()

bool Unit::IsServiceProvider ( ) const
inline

◆ IsSitState()

bool Unit::IsSitState ( ) const
16626{
16627 uint8 s = getStandState();
16628 return
16632}
@ UNIT_STAND_STATE_SIT_HIGH_CHAIR
Definition: UnitDefines.h:38
@ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR
Definition: UnitDefines.h:37
@ UNIT_STAND_STATE_SIT_LOW_CHAIR
Definition: UnitDefines.h:36
@ UNIT_STAND_STATE_SIT_CHAIR
Definition: UnitDefines.h:34

References getStandState(), UNIT_STAND_STATE_SIT, UNIT_STAND_STATE_SIT_CHAIR, UNIT_STAND_STATE_SIT_HIGH_CHAIR, UNIT_STAND_STATE_SIT_LOW_CHAIR, and UNIT_STAND_STATE_SIT_MEDIUM_CHAIR.

Referenced by _ApplyAura(), AttackerStateUpdate(), WorldSession::HandleMovementOpcodes(), IsStandState(), Spell::prepare(), and SpellTakenCritChance().

◆ isSpellBlocked()

bool Unit::isSpellBlocked ( Unit victim,
SpellInfo const *  spellProto,
WeaponAttackType  attackType = BASE_ATTACK 
)
3061{
3062 // These spells can't be blocked
3063 if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3064 return false;
3065
3066 if (victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION) || victim->HasInArc(M_PI, this))
3067 {
3068 // Check creatures flags_extra for disable block
3069 if (victim->GetTypeId() == TYPEID_UNIT &&
3071 return false;
3072
3073 float blockChance = victim->GetUnitBlockChance();
3074 blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f;
3075
3076 // xinef: cant block while casting or while stunned
3077 if (blockChance < 0.0f || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3078 blockChance = 0.0f;
3079
3080 if (roll_chance_f(blockChance))
3081 return true;
3082 }
3083 return false;
3084}
@ UNIT_STATE_CONTROLLED
Definition: UnitDefines.h:190
@ CREATURE_FLAG_EXTRA_NO_BLOCK
Definition: CreatureData.h:50
@ SPELL_AURA_IGNORE_HIT_DIRECTION
Definition: SpellAuraDefines.h:351
@ SPELL_ATTR0_NO_ACTIVE_DEFENSE
Definition: SharedDefines.h:403
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition: Unit.cpp:3750
float GetUnitBlockChance() const
Definition: Unit.cpp:3662

References CREATURE_FLAG_EXTRA_NO_BLOCK, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetMaxSkillValueForLevel(), Object::GetTypeId(), GetUnitBlockChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasAuraType(), Position::HasInArc(), HasUnitState(), IsNonMeleeSpellCast(), roll_chance_f(), SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_AURA_IGNORE_HIT_DIRECTION, Object::ToCreature(), TYPEID_UNIT, and UNIT_STATE_CONTROLLED.

Referenced by CalculateSpellDamageTaken().

◆ IsSpiritGuide()

bool Unit::IsSpiritGuide ( ) const
inline

◆ IsSpiritHealer()

bool Unit::IsSpiritHealer ( ) const
inline

◆ IsSpiritService()

◆ IsStandState()

◆ IsStopped()

bool Unit::IsStopped ( ) const
inline

◆ IsSummon()

bool Unit::IsSummon ( ) const
inline
@ UNIT_MASK_SUMMON
Definition: UnitDefines.h:135

References m_unitTypeMask, and UNIT_MASK_SUMMON.

Referenced by Creature::CanPeriodicallyCallForAssistance(), spell_item_unsated_craving::CheckProc(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Spell::EffectScriptEffect(), boss_skeram::EnterEvadeMode(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), Spell::finish(), GetAllMinionsByEntry(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pri_lightwell::HandleScriptEffect(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), boss_skeram::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::npc_pet_dk_ghoulAI::JustDied(), npc_pet_pri_shadowfiend::JustDied(), boss_skeram::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), BattlefieldWG::OnCreatureCreate(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnCreatureCreate(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnUnitDeath(), RemoveAllControlled(), RemoveAllMinionsByEntry(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), Creature::SaveRespawnTime(), Creature::SearchFormation(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), ToTempSummon(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_skeram::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), and Player::VehicleSpellInitialize().

◆ isSwimming()

◆ IsTabardDesigner()

bool Unit::IsTabardDesigner ( ) const
inline

◆ isTargetableForAttack()

bool Unit::isTargetableForAttack ( bool  checkFakeDeath = true,
Unit const *  byWho = nullptr 
) const
13770{
13771 if (!IsAlive())
13772 return false;
13773
13775 return false;
13776
13777 if (IsImmuneToPC() && byWho && byWho->GetCharmerOrOwnerPlayerOrPlayerItself())
13778 return false;
13779
13780 if (IsPlayer() && ToPlayer()->IsGameMaster())
13781 return false;
13782
13783 return !HasUnitState(UNIT_STATE_UNATTACKABLE) && (!checkFakeDeath || !HasUnitState(UNIT_STATE_DIED));
13784}
@ UNIT_STATE_DIED
Definition: UnitDefines.h:149

References GetCharmerOrOwnerPlayerOrPlayerItself(), HasUnitFlag(), HasUnitState(), IsAlive(), IsImmuneToPC(), Object::IsPlayer(), Object::ToPlayer(), UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_STATE_DIED, and UNIT_STATE_UNATTACKABLE.

Referenced by Creature::_IsTargetAcceptable(), boss_shade_of_aran::AttackStart(), boss_alyson_antille::boss_alyson_antilleAI::AttackStart(), boss_gazakrothAI::AttackStart(), boss_slither::boss_slitherAI::AttackStart(), boss_veklor::AttackStart(), npc_capernian::AttackStart(), Player::IsImmuneToEnvironmentalDamage(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableUnitInObjectRangeCheck::operator()(), NecroticPlagueTargetCheck::operator()(), TotemAI::UpdateAI(), and boss_zuljin::boss_zuljinAI::UpdateAI().

◆ IsTaxi()

bool Unit::IsTaxi ( ) const
inline

◆ IsTotem()

◆ IsTrainer()

◆ IsTriggeredAtSpellProcEvent()

bool Unit::IsTriggeredAtSpellProcEvent ( Unit victim,
Aura aura,
WeaponAttackType  attType,
bool  isVictim,
bool  active,
SpellProcEventEntry const *&  spellProcEvent,
ProcEventInfo const &  eventInfo 
)
private
17327{
17328 SpellInfo const* spellProto = aura->GetSpellInfo();
17329 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
17330
17331 // let the aura be handled by new proc system if it has new entry
17332 if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
17333 return false;
17334
17335 // Get proc Event Entry
17336 spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
17337
17338 // Get EventProcFlag
17339 uint32 EventProcFlag;
17340 if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
17341 EventProcFlag = spellProcEvent->procFlags;
17342 else
17343 EventProcFlag = spellProto->ProcFlags; // else get from spell proto
17344 // Continue if no trigger exist
17345 if (!EventProcFlag)
17346 return false;
17347
17348 // Additional checks for triggered spells (ignore trap casts)
17349 //if (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
17350 //{
17351 // if (!spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_TRIGGERED))
17352 // return false;
17353 //}
17354
17355 // Xinef: additional check for player auras - only player spells can trigger player proc auras
17356 // Xinef: skip victim auras
17357 // Excluded player shoot spells
17358 // Excluded player item spells
17359 if (!isVictim && IsPlayer() && !(EventProcFlag & (PROC_FLAG_KILL | PROC_FLAG_DEATH)))
17360 {
17361 if (procSpell && procSpell->SpellFamilyName == SPELLFAMILY_GENERIC && procSpell->GetCategory() != 76 &&
17362 (!eventInfo.GetProcSpell() || !eventInfo.GetProcSpell()->m_CastItem) &&
17363 (!eventInfo.GetTriggerAuraSpell() || eventInfo.GetTriggerAuraSpell()->SpellFamilyName == SPELLFAMILY_GENERIC))
17364 {
17365 return false;
17366 }
17367 }
17368
17369 // Check spellProcEvent data requirements
17370 if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, eventInfo, active))
17371 return false;
17372 // In most cases req get honor or XP from kill
17373 if (EventProcFlag & PROC_FLAG_KILL && IsPlayer())
17374 {
17375 bool allow = false;
17376
17377 if (victim)
17378 allow = ToPlayer()->isHonorOrXPTarget(victim);
17379
17380 // Shadow Word: Death - can trigger from every kill
17381 if (aura->GetId() == 32409 || aura->GetId() == 18372 || aura->GetId() == 18213)
17382 allow = true;
17383 if (!allow)
17384 return false;
17385 }
17386 // Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
17387 // But except periodic and kill triggers (can triggered from self)
17388 if (procSpell && procSpell->Id == spellProto->Id
17389 && !(spellProto->ProcFlags & (PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
17390 return false;
17391
17392 // Check if current equipment allows aura to proc
17393 if (!isVictim && IsPlayer() && !spellProto->HasAttribute(SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT))
17394 {
17395 Player* player = ToPlayer();
17396 if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
17397 {
17398 Item* item = nullptr;
17399 if (attType == BASE_ATTACK)
17401 else if (attType == OFF_ATTACK)
17403 else
17405
17406 if (player->IsInFeralForm())
17407 return false;
17408
17409 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17410 return false;
17411 }
17412 else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
17413 {
17414 // Check if player is wearing shield
17416 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17417 return false;
17418 }
17419 }
17420 // Get chance from spell
17421 float chance = float(spellProto->ProcChance);
17422 // If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
17423 if (spellProcEvent && spellProcEvent->customChance)
17424 chance = spellProcEvent->customChance;
17425 // If PPM exist calculate chance from PPM
17426 if (spellProcEvent && spellProcEvent->ppmRate != 0)
17427 {
17428 if (!isVictim)
17429 {
17430 uint32 WeaponSpeed = GetAttackTime(attType);
17431 chance = GetPPMProcChance(WeaponSpeed, spellProcEvent->ppmRate, spellProto);
17432 }
17433 else if (victim)
17434 {
17435 uint32 WeaponSpeed = victim->GetAttackTime(attType);
17436 chance = victim->GetPPMProcChance(WeaponSpeed, spellProcEvent->ppmRate, spellProto);
17437 }
17438 }
17439
17440 // Custom chances
17441 switch (spellProto->SpellFamilyName)
17442 {
17444 {
17445 // Recklessness, allow to proc only once for whirlwind
17446 if (spellProto->Id == 1719 && procSpell && procSpell->Id == 44949)
17447 return false;
17448 }
17449 }
17450
17451 if (eventInfo.GetProcChance())
17452 {
17453 chance = *eventInfo.GetProcChance();
17454 }
17455
17456 // Apply chance modifer aura
17457 if (Player* modOwner = GetSpellModOwner())
17458 {
17459 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
17460 }
17461
17462 return roll_chance_f(chance);
17463}
@ ITEM_CLASS_ARMOR
Definition: ItemTemplate.h:303
@ ITEM_CLASS_WEAPON
Definition: ItemTemplate.h:301
@ EQUIPMENT_SLOT_RANGED
Definition: Player.h:692
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition: SpellDefines.h:95
@ PROC_FLAG_DEATH
Definition: SpellMgr.h:143
@ PROC_FLAG_TAKEN_PERIODIC
Definition: SpellMgr.h:135
@ PROC_FLAG_KILL
Definition: SpellMgr.h:108
@ SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT
Definition: SharedDefines.h:494
uint32 Class
Definition: ItemTemplate.h:629
uint32 SubClass
Definition: ItemTemplate.h:630
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition: Player.h:1243
bool isHonorOrXPTarget(Unit *victim) const
Definition: Player.cpp:12613
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition: Unit.cpp:13372
uint32 GetCategory() const
Definition: SpellInfo.cpp:870
int32 EquippedItemClass
Definition: SpellInfo.h:375
uint32 ProcFlags
Definition: SpellInfo.h:355
int32 EquippedItemSubClassMask
Definition: SpellInfo.h:376

References BASE_ATTACK, ItemTemplate::Class, SpellProcEventEntry::customChance, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, GetAttackTime(), SpellInfo::GetCategory(), Aura::GetId(), GetPPMProcChance(), ProcEventInfo::GetProcChance(), ProcEventInfo::GetProcSpell(), ProcEventInfo::GetSpellInfo(), Aura::GetSpellInfo(), GetSpellModOwner(), Item::GetTemplate(), ProcEventInfo::GetTriggerAuraSpell(), Player::GetUseableItemByPos(), SpellInfo::HasAttribute(), SpellInfo::Id, INVENTORY_SLOT_BAG_0, Item::IsBroken(), Player::isHonorOrXPTarget(), IsInFeralForm(), Object::IsPlayer(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, Spell::m_CastItem, OFF_ATTACK, SpellProcEventEntry::ppmRate, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcChance, SpellInfo::ProcFlags, SpellProcEventEntry::procFlags, roll_chance_f(), SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT, SPELLFAMILY_GENERIC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyName, SPELLMOD_CHANCE_OF_SUCCESS, sSpellMgr, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ isTurning()

bool Unit::isTurning ( ) const
inline

◆ IsUnderLastManaUseEffect()

bool Unit::IsUnderLastManaUseEffect ( ) const

◆ IsUnderWater()

bool Unit::IsUnderWater ( ) const
virtual
4303{
4305}
@ LIQUID_MAP_UNDER_WATER
Definition: Map.h:148

References WorldObject::GetLiquidData(), LIQUID_MAP_UNDER_WATER, and LiquidData::Status.

Referenced by Creature::setDeathState().

◆ IsValidAssistTarget()

bool Unit::IsValidAssistTarget ( Unit const *  target) const
13910{
13911 return _IsValidAssistTarget(target, nullptr);
13912}
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition: Unit.cpp:13915

References _IsValidAssistTarget().

Referenced by SmartAI::AssistPlayerInCombatAgainst().

◆ IsValidAttackTarget()

bool Unit::IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell = nullptr 
) const
13787{
13788 return _IsValidAttackTarget(target, bySpell);
13789}

References _IsValidAttackTarget().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), CreatureGroup::GetNewTargetForMember(), WorldSession::HandleAttackSwingOpcode(), npc_beryl_sorcerer::npc_beryl_sorcererAI::JustEngagedWith(), CreatureGroup::MemberEngagingTarget(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::MySelectNextTarget(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestHostileUnitCheck::operator()(), MalleableGooSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), CreatureAI::SetGazeOn(), StopAttackingInvalidTarget(), SimpleCharmedAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateCharmedAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ IsVehicle()

◆ IsVendor()

◆ IsVisible()

bool Unit::IsVisible ( ) const
inline
@ SEC_PLAYER
Definition: Common.h:56
@ SERVERSIDE_VISIBILITY_GM
Definition: SharedDefines.h:1273
T_VALUES GetValue(FLAG_TYPE flag) const
Definition: Object.h:369

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::GetValue(), WorldObject::m_serverSideVisibility, SEC_PLAYER, and SERVERSIDE_VISIBILITY_GM.

Referenced by npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::CanAIAttack(), boss_professor_putricide::boss_professor_putricideAI::CanAIAttack(), boss_sindragosa::boss_sindragosaAI::CanAIAttack(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), SpellInfo::CheckTarget(), AuraEffect::HandlePhase(), Player::IsVisibleGloballyFor(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), Acore::AllFriendlyCreaturesInGrid::operator()(), boss_sapphiron::boss_sapphironAI::Reset(), npc_pos_leader::npc_pos_leaderAI::SetData(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_taldaram::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), and boss_vazruden_the_herald::UpdateAI().

◆ IsWalking()

◆ IsWithinCombatRange()

bool Unit::IsWithinCombatRange ( Unit const *  obj,
float  dist2compare 
) const

◆ IsWithinMeleeRange()

bool Unit::IsWithinMeleeRange ( Unit const *  obj,
float  dist = 0.f 
) const
666{
667 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
668 return false;
669
670 float dx = GetPositionX() - obj->GetPositionX();
671 float dy = GetPositionY() - obj->GetPositionY();
672 float dz = GetPositionZ() - obj->GetPositionZ();
673 float distsq = dx * dx + dy * dy + dz * dz;
674
675 float maxdist = dist + GetMeleeRange(obj);
676
677 return distsq < maxdist * maxdist;
678}

References GetMeleeRange(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_marli::_chargePlayer(), boss_swamplord_muselek::AttackStart(), SmartAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::CanAIAttack(), boss_ouro::CanAIAttack(), boss_murmur::CanAIAttack(), boss_alar::CanAIAttack(), PetAI::CanAttack(), Spell::CheckRange(), UnitAI::DoMeleeAttackIfReady(), boss_zuljin::boss_zuljinAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), spell_shazzrah_gate_dummy::FilterTargets(), boss_supremus::FindHatefulStrikeTarget(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), boss_swamplord_muselek::JustEngagedWith(), boss_vem::JustEngagedWith(), CreatureAI::MoveCircleChecks(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), SpellTargetSelector::operator()(), ThreatContainer::SelectNextVictim(), boss_murmur::ShouldCastResonance(), boss_quartermaster_zigris::SpellHitTarget(), Player::Update(), boss_quartermaster_zigris::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_skeram::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_skarvald_the_constructor::boss_skarvald_the_constructorAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), PetAI::UpdateAI(), npc_zuljin_vortex::npc_zuljin_vortexAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), and boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI().

◆ IsWithinRange()

bool Unit::IsWithinRange ( Unit const *  obj,
float  dist 
) const
687{
688 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
689 {
690 return false;
691 }
692
693 auto dx = GetPositionX() - obj->GetPositionX();
694 auto dy = GetPositionY() - obj->GetPositionY();
695 auto dz = GetPositionZ() - obj->GetPositionZ();
696 auto distsq = dx * dx + dy * dy + dz * dz;
697
698 return distsq <= dist * dist;
699}

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_swamplord_muselek::CanShootVictim().

◆ JumpTo() [1/2]

void Unit::JumpTo ( float  speedXY,
float  speedZ,
bool  forward = true 
)
19418{
19419 float angle = forward ? 0 : M_PI;
19420 if (GetTypeId() == TYPEID_UNIT)
19421 GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ);
19422 else
19423 {
19424 float vcos = cos(angle + GetOrientation());
19425 float vsin = std::sin(angle + GetOrientation());
19426
19427 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19428 data << GetPackGUID();
19429 data << uint32(0); // Sequence
19430 data << float(vcos); // x direction
19431 data << float(vsin); // y direction
19432 data << float(speedXY); // Horizontal speed
19433 data << float(-speedZ); // Z Movement speed (vertical)
19434
19435 ToPlayer()->GetSession()->SendPacket(&data);
19436 }
19437}
@ SMSG_MOVE_KNOCK_BACK
Definition: Opcodes.h:269
WorldSession * GetSession() const
Definition: Player.h:1974
void MoveJumpTo(float angle, float speedXY, float speedZ)
Definition: MotionMaster.cpp:553
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:214

References GetMotionMaster(), Position::GetOrientation(), Object::GetPackGUID(), Player::GetSession(), Object::GetTypeId(), MotionMaster::MoveJumpTo(), WorldSession::SendPacket(), SMSG_MOVE_KNOCK_BACK, Object::ToPlayer(), and TYPEID_UNIT.

Referenced by Spell::EffectLeapBack().

◆ JumpTo() [2/2]

void Unit::JumpTo ( WorldObject obj,
float  speedZ 
)
19440{
19441 float x, y, z;
19442 obj->GetContactPoint(this, x, y, z);
19443 float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ;
19444 GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
19445}
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition: Object.cpp:2739
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=0)
Definition: MotionMaster.h:227

References WorldObject::GetContactPoint(), Position::GetExactDist2d(), GetMotionMaster(), and MotionMaster::MoveJump().

◆ Kill()

void Unit::Kill ( Unit killer,
Unit victim,
bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
static
Todo:
: do instance binding anyway if the charmer/owner is offline
17606{
17607 // Prevent killing unit twice (and giving reward from kill twice)
17608 if (!victim->GetHealth())
17609 return;
17610
17611 if (killer && !killer->IsInMap(victim))
17612 killer = nullptr;
17613
17614 // find player: owner of controlled `this` or `this` itself maybe
17615 Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;
17616 Creature* creature = victim->ToCreature();
17617
17618 bool isRewardAllowed = true;
17619 if (creature)
17620 {
17621 isRewardAllowed = creature->IsDamageEnoughForLootingAndReward();
17622 if (!isRewardAllowed)
17623 creature->SetLootRecipient(nullptr);
17624 }
17625
17626 // pussywizard: remade this if section (player is on the same map
17627 if (isRewardAllowed && creature)
17628 {
17629 Player* lr = creature->GetLootRecipient();
17630 if (lr && lr->IsInMap(creature))
17631 player = creature->GetLootRecipient();
17632 else if (Group* lrg = creature->GetLootRecipientGroup())
17633 for (GroupReference* itr = lrg->GetFirstMember(); itr != nullptr; itr = itr->next())
17634 if (Player* member = itr->GetSource())
17635 if (member->IsAtLootRewardDistance(creature))
17636 {
17637 player = member;
17638 break;
17639 }
17640 }
17641
17642 // Exploit fix
17643 if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
17644 isRewardAllowed = false;
17645
17646 // Reward player, his pets, and group/raid members
17647 // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
17648 if (isRewardAllowed && player && player != victim)
17649 {
17650 WorldPacket data(SMSG_PARTYKILLLOG, (8 + 8)); // send event PARTY_KILL
17651 data << player->GetGUID(); // player with killing blow
17652 data << victim->GetGUID(); // victim
17653
17654 Player* looter = player;
17655 Group* group = player->GetGroup();
17656 bool hasLooterGuid = false;
17657
17658 if (group)
17659 {
17660 group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()));
17661
17662 if (creature)
17663 {
17664 group->UpdateLooterGuid(creature, true);
17665 if (group->GetLooterGuid() && group->GetLootMethod() != FREE_FOR_ALL)
17666 {
17667 looter = ObjectAccessor::FindPlayer(group->GetLooterGuid());
17668 if (looter)
17669 {
17670 hasLooterGuid = true;
17671 creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
17672 }
17673 }
17674 }
17675 }
17676 else
17677 {
17678 player->SendDirectMessage(&data);
17679
17680 if (creature)
17681 {
17682 WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
17683 data2 << creature->GetGUID();
17684 data2 << uint8(0); // unk1
17685 data2 << uint8(0); // no group looter
17686 player->SendMessageToSet(&data2, true);
17687 }
17688 }
17689
17690 // Generate loot before updating looter
17691 if (creature)
17692 {
17693 Loot* loot = &creature->loot;
17694 loot->clear();
17695
17696 if (uint32 lootid = creature->GetCreatureTemplate()->lootid)
17697 loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature);
17698
17699 if (creature->GetLootMode())
17701
17702 if (group)
17703 {
17704 if (hasLooterGuid)
17705 group->SendLooter(creature, looter);
17706 else
17707 group->SendLooter(creature, nullptr);
17708
17709 // Update round robin looter only if the creature had loot
17710 if (!creature->loot.empty())
17711 group->UpdateLooterGuid(creature);
17712 }
17713 }
17714
17715 player->RewardPlayerAndGroupAtKill(victim, false);
17716 }
17717
17718 // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim
17719 if (killer && (killer->IsPet() || killer->IsTotem()))
17720 if (Unit* owner = killer->GetOwner())
17721 {
17722 Unit::ProcDamageAndSpell(owner, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17723 sScriptMgr->OnCreatureKilledByPet( killer->GetCharmerOrOwnerPlayerOrPlayerItself(), victim->ToCreature());
17724 }
17725
17726 if (killer != victim)
17727 {
17728 Unit::ProcDamageAndSpell(killer, victim, killer ? PROC_FLAG_KILL : 0, PROC_FLAG_KILLED, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17729 }
17730
17731 // Proc auras on death - must be before aura/combat remove
17732 Unit::ProcDamageAndSpell(victim, nullptr, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17733
17734 // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
17735 // and before Spirit of Redemption as it also removes auras
17736 if (killer)
17737 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
17738 killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
17739
17740 // Spirit of Redemption
17741 // if talent known but not triggered (check priest class for speedup check)
17742 bool spiritOfRedemption = false;
17744 {
17745 if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
17746 {
17747 // Xinef: aura_spirit_of_redemption is triggered by 27827 shapeshift
17748 if (victim->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION) || victim->HasAura(27827))
17749 {
17750 /*LOG_INFO("misc", "Player ({}) died with spirit of redemption. Killer (Entry: {}, Name: {}), Map: {}, x: {}, y: {}, z: {}",
17751 victim->GetGUID().ToString(), killer ? killer->GetEntry() : 1, killer ? killer->GetName() : "", victim->GetMapId(), victim->GetPositionX(),
17752 victim->GetPositionY(), victim->GetPositionZ());
17753
17754 ACE_Stack_Trace trace(0, 50);
17755 LOG_INFO("misc", "TRACE: {}\n\n", trace);*/
17756 }
17757 else
17758 {
17759 // save value before aura remove
17760 uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
17761 if (!ressSpellId)
17762 ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
17763
17764 //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
17765 victim->RemoveAllAurasOnDeath();
17766
17767 // Stop attacks
17768 victim->CombatStop();
17770
17771 // restore for use at real death
17772 victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
17773
17774 // FORM_SPIRITOFREDEMPTION and related auras
17775 victim->CastSpell(victim, 27827, true, nullptr, aurEff);
17776 spiritOfRedemption = true;
17777 }
17778 }
17779 }
17780
17781 if (!spiritOfRedemption)
17782 {
17783 LOG_DEBUG("entities.unit", "SET DeathState::JustDied");
17784 victim->setDeathState(DeathState::JustDied);
17785 }
17786
17787 // Inform pets (if any) when player kills target)
17788 // MUST come after victim->setDeathState(DeathState::JustDied); or pet next target
17789 // selection will get stuck on same target and break pet react state
17790 if (player)
17791 {
17792 Pet* pet = player->GetPet();
17793 if (pet && pet->IsAlive() && pet->isControlled())
17794 pet->AI()->KilledUnit(victim);
17795 }
17796
17797 // 10% durability loss on death
17798 // clean InHateListOf
17799 if (Player* plrVictim = victim->ToPlayer())
17800 {
17801 // remember victim PvP death for corpse type and corpse reclaim delay
17802 // at original death (not at SpiritOfRedemtionTalent timeout)
17803 plrVictim->SetPvPDeath(player != nullptr);
17804
17805 // only if not player and not controlled by player pet. And not at BG
17806 if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
17807 {
17808 LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH));
17809 plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH), false);
17810 // durability lost message
17811 plrVictim->SendDurabilityLoss();
17812 }
17813 // Call KilledUnit for creatures
17814 if (killer && killer->GetTypeId() == TYPEID_UNIT && killer->IsAIEnabled)
17815 killer->ToCreature()->AI()->KilledUnit(victim);
17816
17817 // last damage from non duel opponent or opponent controlled creature
17818 if (plrVictim->duel)
17819 {
17820 plrVictim->duel->Opponent->CombatStopWithPets(true);
17821 plrVictim->CombatStopWithPets(true);
17822 plrVictim->DuelComplete(DUEL_INTERRUPTED);
17823 }
17824 }
17825 else // creature died
17826 {
17827 LOG_DEBUG("entities.unit", "DealDamageNotPlayer");
17828
17829 if (!creature->IsPet() && creature->GetLootMode() > 0)
17830 {
17831 creature->GetThreatMgr().ClearAllThreat();
17832
17833 // must be after setDeathState which resets dynamic flags
17834 if (!creature->loot.isLooted())
17835 {
17837 }
17838 else
17839 {
17840 creature->AllLootRemovedFromCorpse();
17841 }
17842 }
17843
17844 // Call KilledUnit for creatures, this needs to be called after the lootable flag is set
17845 if (killer && killer->GetTypeId() == TYPEID_UNIT && killer->IsAIEnabled)
17846 killer->ToCreature()->AI()->KilledUnit(victim);
17847
17848 // Call creature just died function
17849 if (CreatureAI* ai = creature->AI())
17850 {
17851 ai->JustDied(killer);
17852 }
17853
17854 if (TempSummon* summon = creature->ToTempSummon())
17855 {
17856 if (WorldObject* summoner = summon->GetSummoner())
17857 {
17858 if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled)
17859 {
17860 summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer);
17861 }
17862 else if (summoner->ToGameObject() && summoner->ToGameObject()->AI())
17863 {
17864 summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer);
17865 }
17866 }
17867 }
17868
17869 // Dungeon specific stuff, only applies to players killing creatures
17870 if (creature->GetInstanceId())
17871 {
17872 Map* instanceMap = creature->GetMap();
17873 //Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
17875
17876 if (instanceMap->IsDungeon() && player)
17877 if (instanceMap->IsRaidOrHeroicDungeon())
17879 instanceMap->ToInstanceMap()->PermBindAllPlayers();
17880 }
17881 }
17882
17883 // outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
17884 // handle player kill only if not suicide (spirit of redemption for example)
17885 if (player && killer != victim)
17886 {
17887 if (OutdoorPvP* pvp = player->GetOutdoorPvP())
17888 pvp->HandleKill(player, victim);
17889
17890 if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
17891 bf->HandleKill(player, victim);
17892 }
17893
17894 //if (victim->IsPlayer())
17895 // if (OutdoorPvP* pvp = victim->ToPlayer()->GetOutdoorPvP())
17896 // pvp->HandlePlayerActivityChangedpVictim->ToPlayer();
17897
17898 // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
17899 if (player)
17900 if (Battleground* bg = player->GetBattleground())
17901 {
17902 if (victim->IsPlayer())
17903 bg->HandleKillPlayer(victim->ToPlayer(), player);
17904 else
17905 bg->HandleKillUnit(victim->ToCreature(), player);
17906 }
17907
17908 // achievement stuff
17909 if (killer && victim->IsPlayer())
17910 {
17911 if (killer->GetTypeId() == TYPEID_UNIT)
17913 else if (victim != killer && killer->IsPlayer())
17915 }
17916
17917 // Hook for OnPVPKill Event
17918 if (killer)
17919 {
17920 if (Player* killerPlr = killer->ToPlayer())
17921 {
17922 if (Player* killedPlr = victim->ToPlayer())
17923 sScriptMgr->OnPVPKill(killerPlr, killedPlr);
17924 else if (Creature* killedCre = victim->ToCreature())
17925 sScriptMgr->OnCreatureKill(killerPlr, killedCre);
17926 }
17927 else if (Creature* killerCre = killer->ToCreature())
17928 {
17929 if (Player* killed = victim->ToPlayer())
17930 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
17931 }
17932 }
17933
17934 sScriptMgr->OnUnitDeath(victim, killer);
17935}
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition: Player.h:488
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition: CreatureData.h:46
@ PLAYER_SELF_RES_SPELL
Definition: UpdateFields.h:370
@ FREE_FOR_ALL
Definition: LootMgr.h:59
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
@ PROC_FLAG_KILLED
Definition: SpellMgr.h:107
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition: IWorld.h:71
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition: IWorld.h:515
#define sBattlefieldMgr
Definition: BattlefieldMgr.h:77
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition: DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition: DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition: DBCEnums.h:170
@ UNIT_DYNFLAG_LOOTABLE
Definition: SharedDefines.h:3121
@ DUEL_INTERRUPTED
Definition: SharedDefines.h:3612
@ SMSG_PARTYKILLLOG
Definition: Opcodes.h:531
@ SMSG_LOOT_LIST
Definition: Opcodes.h:1047
Player * FindPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:248
Definition: CreatureAI.h:71
virtual void KilledUnit(Unit *)
Definition: CreatureAI.h:130
Definition: Battlefield.h:206
Loot loot
Definition: Creature.h:221
uint16 GetLootMode() const
Definition: Creature.h:235
void AllLootRemovedFromCorpse()
Definition: Creature.cpp:2960
Player * GetLootRecipient() const
Definition: Creature.cpp:1299
bool IsDamageEnoughForLootingAndReward() const
Definition: Creature.cpp:3760
Group * GetLootRecipientGroup() const
Definition: Creature.cpp:1306
uint32 mingold
Definition: CreatureData.h:234
uint32 maxgold
Definition: CreatureData.h:235
uint32 lootid
Definition: CreatureData.h:227
virtual void SetDynamicFlag(uint32 flag)
Definition: Object.h:120
uint32 GetInstanceId() const
Definition: Object.h:441
uint32 GetZoneId() const
Definition: Object.cpp:3141
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:5648
TeamId GetTeamId(bool original=false) const
Definition: Player.h:2084
Battleground * GetBattleground(bool create=false) const
Definition: Player.cpp:12148
uint32 GetResurrectionSpellId()
Definition: Player.cpp:12556
OutdoorPvP * GetOutdoorPvP() const
Definition: Player.cpp:12457
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition: Player.cpp:12676
void RemoveAllAurasOnDeath()
Definition: Unit.cpp:5293
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition: Unit.cpp:5494
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition: Group.cpp:1757
uint8 GetMemberGroup(ObjectGuid guid) const
Definition: Group.cpp:2384
ObjectGuid GetLooterGuid() const
Definition: Group.cpp:2321
LootMethod GetLootMethod() const
Definition: Group.cpp:2316
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition: Group.cpp:1868
void SendLooter(Creature *creature, Player *pLooter)
Definition: Group.cpp:969
Definition: LootMgr.h:313
bool empty() const
Definition: LootMgr.h:367
bool isLooted() const
Definition: LootMgr.h:368
void clear()
Definition: LootMgr.h:343
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition: LootMgr.cpp:829
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition: LootMgr.cpp:564
Definition: Map.h:313
bool IsRaidOrHeroicDungeon() const
Definition: Map.h:451
InstanceMap * ToInstanceMap()
Definition: Map.h:546
void PermBindAllPlayers()
Definition: Map.cpp:3152
Definition: OutdoorPvP.h:186

References ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, Creature::AI(), Creature::AllLootRemovedFromCorpse(), Group::BroadcastPacket(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_PRIEST, Loot::clear(), ThreatMgr::ClearAllThreat(), CombatStop(), CONFIG_DURABILITY_LOSS_IN_PVP, CREATURE_FLAG_EXTRA_INSTANCE_BIND, HostileRefMgr::deleteReferences(), DUEL_INTERRUPTED, Loot::empty(), Loot::FillLoot(), ObjectAccessor::FindPlayer(), CreatureTemplate::flags_extra, FREE_FOR_ALL, Loot::generateMoneyLoot(), GetAuraEffectDummy(), Player::GetBattleground(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), Object::GetEntry(), Player::GetGroup(), Object::GetGUID(), GetHealth(), getHostileRefMgr(), WorldObject::GetInstanceId(), Group::GetLooterGuid(), Group::GetLootMethod(), Creature::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), WorldObject::GetMap(), Group::GetMemberGroup(), Player::GetOutdoorPvP(), GetOwner(), GetOwnerGUID(), Player::GetPet(), Player::GetResurrectionSpellId(), Player::GetTeamId(), GetThreatMgr(), Object::GetTypeId(), Object::GetUInt32Value(), WorldObject::GetZoneId(), HasAura(), HasAuraType(), Player::HasPlayerFlag(), Player::InBattleground(), IsAIEnabled, IsAlive(), IsClass(), Pet::isControlled(), Creature::IsDamageEnoughForLootingAndReward(), Map::IsDungeon(), WorldObject::IsInMap(), Loot::isLooted(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), Map::IsRaidOrHeroicDungeon(), IsTotem(), CreatureAI::KilledUnit(), LOG_DEBUG, Creature::loot, CreatureTemplate::lootid, LootTemplates_Creature, CreatureTemplate::maxgold, CreatureTemplate::mingold, GroupReference::next(), InstanceMap::PermBindAllPlayers(), PLAYER_FLAGS_IS_OUT_OF_BOUNDS, PLAYER_SELF_RES_SPELL, PROC_EX_NONE, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_FLAG_NONE, ProcDamageAndSpell(), RATE_DURABILITY_LOSS_ON_DEATH, RemoveAllAurasOnDeath(), Player::RewardPlayerAndGroupAtKill(), sBattlefieldMgr, Player::SendDirectMessage(), Group::SendLooter(), Player::SendMessageToSet(), setDeathState(), Object::SetDynamicFlag(), Creature::SetLootRecipient(), SetUInt32Value(), SMSG_LOOT_LIST, SMSG_PARTYKILLLOG, SPELL_AURA_SPIRIT_OF_REDEMPTION, sScriptMgr, sWorld, Object::ToCreature(), Map::ToInstanceMap(), Object::ToPlayer(), ToTempSummon(), TYPEID_UNIT, UNIT_DYNFLAG_LOOTABLE, Player::UpdateAchievementCriteria(), and Group::UpdateLooterGuid().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), boss_headless_horseman_head::DamageTaken(), boss_viscidus::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_brutallus::boss_brutallusAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), boss_jedoga_shadowseeker::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_illidari_council::DoAction(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), DeathEvent::Execute(), AuraEffect::HandleAuraControlVehicle(), BattlegroundIC::HandleCapturedNodes(), misc_commandscript::HandleDieCommand(), spell_ooze_zap_channel_end::HandleDummy(), spell_pos_rimefang_frost_nova::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_yogg_saron_titanic_storm::HandleDummyEffect(), spell_item_rocket_chicken::HandleDummyTick(), spell_ulduar_arachnopod_damaged_aura::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_teron_gorefiend_spiritual_vengeance::HandleEffectRemove(), spell_voa_overcharge::spell_voa_overcharge_AuraScript::HandlePeriodicDummy(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_leotheras_clear_consuming_madness::HandleScriptEffect(), boss_kiljaeden::boss_kiljaedenAI::JustDied(), boss_entropius::boss_entropiusAI::JustDied(), boss_twin_valkyrAI::JustDied(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_sister_svalna::boss_sister_svalnaAI::JustDied(), boss_ignis::boss_ignisAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), boss_ahune::JustDied(), npc_frozen_core::JustDied(), boss_twinemperorsAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), KillSelf(), boss_buru::ManipulateEggs(), npc_burning_spirit::npc_burning_spiritAI::MovementInform(), spell_yogg_saron_insane_aura::OnRemove(), WretchedGhoulCleaner::operator()(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::PassengerBoarded(), SmartScript::ProcessAction(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), boss_faerlina::boss_faerlinaAI::SpellHit(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::Update(), SimpleCharmedAI::UpdateAI(), boss_selin_fireheart::UpdateAI(), npc_crusade_persuaded::npc_crusade_persuadedAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), and npc_emily::npc_emilyAI::WaypointReached().

◆ KillSelf()

void Unit::KillSelf ( bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
inline
895{ Kill(this, this, durabilityLoss, attackType, spellProto, spell); };

References Kill().

Referenced by npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_illidari_council::DoAction(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), npc_raging_flames::FixateRandomTarget(), npc_rancid_mushroom::InitializeAI(), boss_warlord_kalithresh::JustDied(), npc_pet_gen_plump_turkey::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), npc_announcer_toc5::npc_announcer_toc5AI::MovementInform(), boss_glob_of_viscidus::MovementInform(), SmartScript::ProcessAction(), boss_archimonde::Reset(), npc_dark_iron_guzzler::SpellHit(), boss_victor_nefarius::boss_victor_nefariusAI::SummonedCreatureDies(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDies(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::SummonedCreatureDies(), boss_vazruden_the_herald::SummonedCreatureDies(), npc_warden_mellichar::npc_warden_mellicharAI::SummonedCreatureDies(), boss_felblood_kaelthas::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and npc_frost_tomb::npc_frost_tombAI::UpdateAI().

◆ KnockbackFrom()

void Unit::KnockbackFrom ( float  x,
float  y,
float  speedXY,
float  speedZ 
)
19047{
19048 Player* player = ToPlayer();
19049 if (!player)
19050 {
19051 if (Unit* charmer = GetCharmer())
19052 {
19053 player = charmer->ToPlayer();
19054 if (player && player->m_mover != this)
19055 player = nullptr;
19056 }
19057 }
19058
19059 if (!player)
19060 {
19061 GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
19062 }
19063 else
19064 {
19065 float vcos, vsin;
19066 GetSinCos(x, y, vsin, vcos);
19067
19068 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19069 data << GetPackGUID();
19070 data << uint32(0); // counter
19071 data << float(vcos); // x direction
19072 data << float(vsin); // y direction
19073 data << float(speedXY); // Horizontal speed
19074 data << float(-speedZ); // Z Movement speed (vertical)
19075
19076 player->GetSession()->SendPacket(&data);
19077
19079 player->SetCanFly(true, true);
19080
19081 player->SetCanKnockback(true);
19082 }
19083}
@ SPELL_AURA_FLY
Definition: SpellAuraDefines.h:264
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
Definition: SpellAuraDefines.h:270
void GetSinCos(float x, float y, float &vsin, float &vcos) const
Definition: Position.cpp:91
SafeUnitPointer m_mover
Definition: Player.h:2309
void SetCanKnockback(bool value)
Definition: Player.h:2476
bool SetCanFly(bool apply, bool packetOnly=false) override
Definition: Player.cpp:15868
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
Definition: MotionMaster.cpp:527

References GetCharmer(), GetMotionMaster(), Object::GetPackGUID(), Player::GetSession(), Position::GetSinCos(), HasAuraType(), Player::m_mover, MotionMaster::MoveKnockbackFrom(), WorldSession::SendPacket(), Player::SetCanFly(), Player::SetCanKnockback(), SMSG_MOVE_KNOCK_BACK, SPELL_AURA_FLY, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, and Object::ToPlayer().

Referenced by _ExitVehicle(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), Spell::EffectKnockBack(), spell_warhead_detonate::HandleDummy(), npc_vekjik::OnGossipSelect(), and npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI().

◆ MagicSpellHitResult()

SpellMissInfo Unit::MagicSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3288{
3289 // Can`t miss on dead target (on skinning for example)
3290 if (!victim->IsAlive() && victim->GetTypeId() != TYPEID_PLAYER)
3291 return SPELL_MISS_NONE;
3292
3293 // vehicles cant miss
3294 if (IsVehicle())
3295 return SPELL_MISS_NONE;
3296
3297 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3298 // resist and deflect chances
3299 // xinef: skip all calculations, proof: Toxic Tolerance quest
3300 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3301 return SPELL_MISS_NONE;
3302
3303 if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
3304 {
3305 return SPELL_MISS_NONE;
3306 }
3307
3308 SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
3309 int32 thisLevel = getLevelForTarget(victim);
3310 if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsTrigger())
3311 thisLevel = std::max<int32>(thisLevel, spellInfo->SpellLevel);
3312 int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel;
3313
3314 int32 MISS_CHANCE_MULTIPLIER;
3315 if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && GetTypeId() != TYPEID_PLAYER) // keep it as it was originally (7 and 11)
3316 {
3317 MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11;
3318 }
3319 else
3320 {
3321 MISS_CHANCE_MULTIPLIER = sWorld->getRate(
3322 victim->IsPlayer()
3325 }
3326
3327 // Base hit chance from attacker and victim levels
3328 int32 modHitChance = levelDiff < 3
3329 ? 96 - levelDiff
3330 : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER;
3331
3332 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
3333 if (Player* modOwner = GetSpellModOwner())
3334 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_RESIST_MISS_CHANCE, modHitChance);
3335
3336 // Increase from attacker SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT auras
3338
3339 // Spells with SPELL_ATTR3_ALWAYS_HIT will ignore target's avoidance effects
3340 // xinef: imo it should completly ignore all calculations, eg: 14792. Hits 80 level players on blizz without any problems
3341 //if (!spell->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3342 {
3343 // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
3345 // Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
3346 if (spellInfo->IsAffectingArea())
3347 modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
3348
3349 // Decrease hit chance from victim rating bonus
3350 if (victim->IsPlayer())
3351 modHitChance -= int32(victim->ToPlayer()->GetRatingBonusValue(CR_HIT_TAKEN_SPELL));
3352 }
3353
3354 int32 HitChance = modHitChance * 100;
3355 // Increase hit chance from attacker SPELL_AURA_MOD_SPELL_HIT_CHANCE and attacker ratings
3356 // Xinef: Totems should inherit casters ratings?
3357 if (IsTotem())
3358 {
3359 if (Unit* owner = GetOwner())
3360 HitChance += int32(owner->m_modSpellHitChance * 100.0f);
3361 }
3362 else
3363 HitChance += int32(m_modSpellHitChance * 100.0f);
3364
3365 if (HitChance < 100)
3366 HitChance = 100;
3367 else if (HitChance > 10000)
3368 HitChance = 10000;
3369
3370 int32 tmp = 10000 - HitChance;
3371
3372 int32 rand = irand(1, 10000); // Needs to be 1 to 10000 to avoid the 1/10000 chance to miss on 100% hit rating
3373
3374 if (rand < tmp)
3375 return SPELL_MISS_MISS;
3376
3377 // Chance resist mechanic (select max value from every mechanic spell effect)
3378 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3379 tmp += resist_chance;
3380
3381 // Chance resist debuff
3382 if (!spellInfo->IsPositive() && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))
3383 {
3384 bool bNegativeAura = true;
3385 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3386 {
3387 // Xinef: Check if effect exists!
3388 if (spellInfo->Effects[i].IsEffect() && spellInfo->Effects[i].ApplyAuraName == 0)
3389 {
3390 bNegativeAura = false;
3391 break;
3392 }
3393 }
3394
3395 if (bNegativeAura)
3396 {
3397 tmp += victim->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3398 tmp += victim->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3399 }
3400
3401 // Players resistance for binary spells
3402 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_HOLY)) == 0)
3403 tmp += int32(Unit::GetEffectiveResistChance(this, spellInfo->GetSchoolMask(), victim) * 10000.0f); // 100 for spell calculations, and 100 for return value percentage
3404 }
3405
3406 // Roll chance
3407 if (rand < tmp)
3408 return SPELL_MISS_RESIST;
3409
3410 // cast by caster in front of victim
3411 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION)))
3412 {
3413 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3414 tmp += deflect_chance;
3415 if (rand < tmp)
3416 return SPELL_MISS_DEFLECT;
3417 }
3418
3419 return SPELL_MISS_NONE;
3420}
@ CR_HIT_TAKEN_SPELL
Definition: Unit.h:230
@ SPELL_AURA_MOD_DEBUFF_RESISTANCE
Definition: SpellAuraDefines.h:241
@ SPELL_AURA_DEFLECT_SPELLS
Definition: SpellAuraDefines.h:350
@ SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT
Definition: SpellAuraDefines.h:262
@ SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE
Definition: SpellAuraDefines.h:249
@ SPELL_AURA_MOD_AOE_AVOIDANCE
Definition: SpellAuraDefines.h:223
@ SPELLMOD_RESIST_MISS_CHANCE
Definition: SpellDefines.h:93
@ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS
Definition: IWorld.h:178
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER
Definition: IWorld.h:522
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE
Definition: IWorld.h:521
@ SPELL_ATTR7_NO_ATTACK_MISS
Definition: SharedDefines.h:666
@ SPELL_MISS_NONE
Definition: SharedDefines.h:1519
@ SPELL_MISS_RESIST
Definition: SharedDefines.h:1521
@ SPELL_MISS_MISS
Definition: SharedDefines.h:1520
@ SPELL_MISS_DEFLECT
Definition: SharedDefines.h:1528
float GetRatingBonusValue(CombatRating cr) const
Definition: Player.cpp:5141
int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5996
int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition: Unit.cpp:5982
int32 GetMechanicResistChance(SpellInfo const *spell)
Definition: Unit.cpp:3093

References CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS, CR_HIT_TAKEN_SPELL, SpellInfo::Dispel, SpellInfo::Effects, GetEffectiveResistChance(), getLevelForTarget(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifierByMiscValue(), GetMechanicResistChance(), GetOwner(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Object::GetTypeId(), SpellInfo::HasAttribute(), HasAuraType(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, irand(), SpellInfo::IsAffectingArea(), IsAlive(), Object::IsPlayer(), SpellInfo::IsPositive(), IsTotem(), IsVehicle(), m_modSpellHitChance, MAX_SPELL_EFFECTS, RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_NO_CAST_LOG, SPELL_ATTR7_NO_ATTACK_MISS, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_HIT_DIRECTION, SPELL_AURA_MOD_AOE_AVOIDANCE, SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELL_AURA_MOD_DEBUFF_RESISTANCE, SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT, SPELL_MISS_DEFLECT, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_RESIST, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NORMAL, SpellInfo::SpellLevel, SPELLMOD_RESIST_MISS_CHANCE, sWorld, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, and UNIT_STATE_STUNNED.

Referenced by SpellHitResult().

◆ MeleeDamageBonusDone()

uint32 Unit::MeleeDamageBonusDone ( Unit pVictim,
uint32  damage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
12996{
12997 if (!victim || pdamage == 0)
12998 return 0;
12999
13000 if (GetTypeId() == TYPEID_UNIT)
13001 {
13002 // Dancing Rune Weapon...
13003 if (GetEntry() == 27893)
13004 {
13005 if (Unit* owner = GetOwner())
13006 return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2;
13007 }
13008 }
13009
13010 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
13011
13012 // Done fixed damage bonus auras
13013 int32 DoneFlatBenefit = 0;
13014
13015 // ..done
13017 for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i)
13018 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13019 DoneFlatBenefit += (*i)->GetAmount();
13020
13021 // ..done
13022 // SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
13023
13024 // ..done (base at attack power for marked target and base at attack power for creature type)
13025 int32 APbonus = 0;
13026
13027 if (attType == RANGED_ATTACK)
13028 {
13029 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
13030
13031 // ..done (base at attack power and creature type)
13033 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13034 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13035 APbonus += (*i)->GetAmount();
13036 }
13037 else
13038 {
13039 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
13040
13041 // ..done (base at attack power and creature type)
13043 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13044 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13045 APbonus += (*i)->GetAmount();
13046 }
13047
13048 if (APbonus != 0) // Can be negative
13049 {
13050 bool normalized = false;
13051 if (spellProto)
13052 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13053 if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG)
13054 {
13055 normalized = true;
13056 break;
13057 }
13058 DoneFlatBenefit += int32(APbonus / 14.0f * GetAPMultiplier(attType, normalized));
13059 }
13060
13061 // Done total percent damage auras
13062 float DoneTotalMod = 1.0f;
13063
13064 // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation
13065 if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL))
13066 {
13067 // Some spells don't benefit from pct done mods
13069 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
13070 {
13071 if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, *i, false) &&
13072 sScriptMgr->IsNeedModMeleeDamagePercent(this, *i, DoneTotalMod, spellProto)))
13073 {
13074 if (((*i)->GetMiscValue() & damageSchoolMask))
13075 {
13076 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
13077 AddPct(DoneTotalMod, (*i)->GetAmount());
13078 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
13079 AddPct(DoneTotalMod, (*i)->GetAmount());
13080 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
13081 AddPct(DoneTotalMod, (*i)->GetAmount());
13082 }
13083 }
13084 }
13085 }
13086
13088 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
13089 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13090 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13091 AddPct(DoneTotalMod, (*i)->GetAmount());
13092
13093 // bonus against aurastate
13095 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
13096 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())))
13097 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13098 AddPct(DoneTotalMod, (*i)->GetAmount());
13099
13100 // done scripted mod (take it from owner)
13101 Unit* owner = GetOwner() ? GetOwner() : this;
13102 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13103 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
13104 {
13105 if (spellProto && !spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13106 continue;
13107
13108 if (!(*i)->IsAffectedOnSpell(spellProto))
13109 continue;
13110
13111 switch ((*i)->GetMiscValue())
13112 {
13113 // Tundra Stalker
13114 // Merciless Combat
13115 case 7277:
13116 {
13117 // Merciless Combat
13118 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
13119 {
13120 if (!victim->HealthAbovePct(35))
13121 AddPct(DoneTotalMod, (*i)->GetAmount());
13122 }
13123 // Tundra Stalker
13124 else
13125 {
13126 // Frost Fever (target debuff)
13127 if (victim->HasAura(55095))
13128 AddPct(DoneTotalMod, (*i)->GetAmount());
13129 }
13130 break;
13131 }
13132 // Rage of Rivendare
13133 case 7293:
13134 {
13135 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0x02000000, 0))
13136 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
13137 break;
13138 }
13139 // Marked for Death
13140 case 7598:
13141 case 7599:
13142 case 7600:
13143 case 7601:
13144 case 7602:
13145 {
13146 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
13147 AddPct(DoneTotalMod, (*i)->GetAmount());
13148 break;
13149 }
13150 // Dirty Deeds
13151 case 6427:
13152 case 6428:
13153 {
13154 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
13155 {
13156 // effect 0 has expected value but in negative state
13157 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
13158 AddPct(DoneTotalMod, bonus);
13159 }
13160 break;
13161 }
13162 }
13163 }
13164
13165 // Custom scripted damage
13166 if (spellProto)
13167 switch (spellProto->SpellFamilyName)
13168 {
13170 // Glacier Rot
13171 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
13173 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
13174 AddPct(DoneTotalMod, aurEff->GetAmount());
13175 break;
13176 }
13177
13178 // Some spells don't benefit from done mods
13179 if (spellProto)
13180 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
13181 {
13182 DoneFlatBenefit = 0;
13183 DoneTotalMod = 1.0f;
13184 }
13185
13186 float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
13187
13188 // apply spellmod to Done damage
13189 if (spellProto)
13190 if (Player* modOwner = GetSpellModOwner())
13191 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage);
13192
13193 // bonus result can be negative
13194 return uint32(std::max(tmpDamage, 0.0f));
13195}
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
Definition: SpellAuraDefines.h:165
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS
Definition: SpellAuraDefines.h:231
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
Definition: SpellAuraDefines.h:194
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition: SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE
Definition: SpellAuraDefines.h:366
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
Definition: SpellAuraDefines.h:122
@ SPELLMOD_DAMAGE
Definition: SpellDefines.h:77
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
Definition: SharedDefines.h:899
@ SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM
Definition: SharedDefines.h:583
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
Definition: SharedDefines.h:522
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition: Unit.cpp:17132
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition: Unit.h:1318

References AddPct(), AURA_STATE_HEALTHLESS_35_PERCENT, SpellInfo::Effects, GetAPMultiplier(), GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), GetSpellModOwner(), GetTotalAuraModifier(), Object::GetTypeId(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HealthAbovePct(), SpellInfo::Id, MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_EFFECT_NORMALIZED_WEAPON_DMG, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_DAMAGE, sScriptMgr, Object::ToPlayer(), TYPEID_UNIT, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeDamageBonusTaken()

uint32 Unit::MeleeDamageBonusTaken ( Unit attacker,
uint32  pdamage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13198{
13199 if (pdamage == 0)
13200 return 0;
13201
13202 int32 TakenFlatBenefit = 0;
13203
13204 // ..taken
13206 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
13207 if ((*i)->GetMiscValue() & damageSchoolMask)
13208 TakenFlatBenefit += (*i)->GetAmount();
13209
13210 if (attType != RANGED_ATTACK)
13212 else
13214
13215 // Taken total percent damage auras
13216 float TakenTotalMod = 1.0f;
13217
13219
13220 // .. taken pct (special attacks)
13221 if (spellProto)
13222 {
13223 // From caster spells
13225 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
13226 if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
13227 AddPct(TakenTotalMod, (*i)->GetAmount());
13228
13229 // Mod damage from spell mechanic
13230 uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
13231
13232 // Shred, Maul - "Effects which increase Bleed damage also increase Shred damage"
13233 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[0] & 0x00008800)
13234 mechanicMask |= (1 << MECHANIC_BLEED);
13235
13236 if (mechanicMask)
13237 {
13239 for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i)
13240 if (mechanicMask & uint32(1 << ((*i)->GetMiscValue())))
13241 AddPct(TakenTotalMod, (*i)->GetAmount());
13242 }
13243 }
13244
13245 TakenTotalMod = processDummyAuras(TakenTotalMod);
13246
13247 // .. taken pct: class scripts
13248 /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13249 for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i)
13250 {
13251 switch ((*i)->GetMiscValue())
13252 {
13253 }
13254 }*/
13255
13256 if (attType != RANGED_ATTACK)
13257 {
13259 for (AuraEffectList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i)
13260 AddPct(TakenTotalMod, (*i)->GetAmount());
13261 }
13262 else
13263 {
13264 AuraEffectList const& mModRangedDamageTakenPercent = GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT);
13265 for (AuraEffectList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i)
13266 AddPct(TakenTotalMod, (*i)->GetAmount());
13267 }
13268
13269 // No positive taken bonus, custom attr
13270 if (spellProto)
13271 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
13272 {
13273 TakenFlatBenefit = 0;
13274 TakenTotalMod = 1.0f;
13275 }
13276
13277 // xinef: sanctified wrath talent
13278 if (TakenTotalMod < 1.0f && attacker->HasAuraType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST))
13279 {
13280 float ignoreModifier = 1.0f - TakenTotalMod;
13281 bool addModifier = false;
13283 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
13284 if ((*j)->GetMiscValue() & damageSchoolMask)
13285 {
13286 ApplyPct(ignoreModifier, (*j)->GetAmount());
13287 addModifier = true;
13288 }
13289
13290 if (addModifier)
13291 TakenTotalMod += ignoreModifier;
13292 }
13293
13294 float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
13295
13296 // bonus result can be negative
13297 return uint32(std::max(tmpDamage, 0.0f));
13298}
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:176
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
Definition: SpellAuraDefines.h:150
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:188
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
Definition: SpellAuraDefines.h:189
@ SPELL_AURA_MOD_DAMAGE_TAKEN
Definition: SpellAuraDefines.h:77
@ SPELL_AURA_MOD_DAMAGE_FROM_CASTER
Definition: SpellAuraDefines.h:334
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
Definition: SpellAuraDefines.h:318
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT
Definition: SpellAuraDefines.h:177
@ SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS
Definition: SpellInfo.h:197
float processDummyAuras(float TakenTotalMod) const
Definition: Unit.cpp:11823

References AddPct(), ApplyPct(), SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), GetTotalAuraModifier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasAuraType(), MECHANIC_BLEED, processDummyAuras(), RANGED_ATTACK, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_DAMAGE_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeSpellHitResult()

SpellMissInfo Unit::MeleeSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3115{
3116 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3117 // resist and deflect chances
3118 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3119 return SPELL_MISS_NONE;
3120
3121 WeaponAttackType attType = BASE_ATTACK;
3122
3123 // Check damage class instead of attack type to correctly handle judgements
3124 // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class
3125 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
3126 attType = RANGED_ATTACK;
3127
3128 int32 attackerWeaponSkill;
3129 // skill value for these spells (for example judgements) is 5* level
3130 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED && !spellInfo->IsRangedWeaponSpell())
3131 attackerWeaponSkill = GetLevel() * 5;
3132 // bonus from skills is 0.04% per skill Diff
3133 else
3134 attackerWeaponSkill = int32(GetWeaponSkillValue(attType, victim));
3135
3136 int32 skillDiff = attackerWeaponSkill - int32(victim->GetMaxSkillValueForLevel(this));
3137
3138 uint32 roll = urand (0, 10000);
3139
3140 uint32 missChance = uint32(MeleeSpellMissChance(victim, attType, skillDiff, spellInfo->Id) * 100.0f);
3141 // Roll miss
3142 uint32 tmp = missChance;
3143 if (roll < tmp)
3144 return SPELL_MISS_MISS;
3145
3146 bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
3147 bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
3148 bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
3149
3150 // Same spells cannot be parry/dodge
3151 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3152 return SPELL_MISS_NONE;
3153
3154 // Chance resist mechanic
3155 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3156 tmp += resist_chance;
3157 if (roll < tmp)
3158 return SPELL_MISS_RESIST;
3159
3160 // Ranged attacks can only miss, resist and deflect
3161 if (attType == RANGED_ATTACK)
3162 {
3163 // only if in front
3164 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION)))
3165 {
3166 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3167 tmp += deflect_chance;
3168 if (roll < tmp)
3169 return SPELL_MISS_DEFLECT;
3170 }
3171
3172 canDodge = false;
3173 canParry = false;
3174 }
3175
3176 // Check for attack from behind
3177 // xinef: if from behind or spell requires cast from behind
3178 if (!victim->HasInArc(M_PI, this))
3179 {
3181 {
3182 // Can`t dodge from behind in PvP (but its possible in PvE)
3183 if (victim->IsPlayer())
3184 {
3185 canDodge = false;
3186 }
3187
3188 // Can`t parry or block
3189 canParry = false;
3190 canBlock = false;
3191 }
3192 }
3193
3194 // Check creatures flags_extra for disable parry
3195 if (victim->GetTypeId() == TYPEID_UNIT)
3196 {
3197 uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra;
3198 // Xinef: no dodge flag
3199 if (flagEx & CREATURE_FLAG_EXTRA_NO_DODGE)
3200 canDodge = false;
3201 if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY)
3202 canParry = false;
3203 // Check creatures flags_extra for disable block
3204 if (flagEx & CREATURE_FLAG_EXTRA_NO_BLOCK)
3205 canBlock = false;
3206 }
3207 // Ignore combat result aura
3209 for (AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
3210 {
3211 if (!(*i)->IsAffectedOnSpell(spellInfo))
3212 continue;
3213 switch ((*i)->GetMiscValue())
3214 {
3215 case MELEE_HIT_DODGE:
3216 canDodge = false;
3217 break;
3218 case MELEE_HIT_BLOCK:
3219 canBlock = false;
3220 break;
3221 case MELEE_HIT_PARRY:
3222 canParry = false;
3223 break;
3224 default:
3225 LOG_DEBUG("entities.unit", "Spell {} SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state {}", (*i)->GetId(), (*i)->GetMiscValue());
3226 break;
3227 }
3228 }
3229
3230 if (canDodge)
3231 {
3232 // Roll dodge
3233 int32 dodgeChance = int32(victim->GetUnitDodgeChance() * 100.0f) - skillDiff * 4;
3234 // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
3236 dodgeChance = int32(float(dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
3237 // Reduce dodge chance by attacker expertise rating
3238 if (IsPlayer())
3239 dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3240 else
3242
3243 // xinef: cant dodge while casting or while stunned
3244 if (dodgeChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3245 dodgeChance = 0;
3246
3247 tmp += dodgeChance;
3248 if (roll < tmp)
3249 return SPELL_MISS_DODGE;
3250 }
3251
3252 if (canParry)
3253 {
3254 // Roll parry
3255 int32 parryChance = int32(victim->GetUnitParryChance() * 100.0f) - skillDiff * 4;
3256 // Reduce parry chance by attacker expertise rating
3257 if (IsPlayer())
3258 parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3259 else
3261
3262 // xinef: cant parry while casting or while stunned
3263 if (parryChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3264 parryChance = 0;
3265
3266 tmp += parryChance;
3267 if (roll < tmp)
3268 return SPELL_MISS_PARRY;
3269 }
3270
3271 if (canBlock)
3272 {
3273 int32 blockChance = int32(victim->GetUnitBlockChance() * 100.0f) - skillDiff * 4;
3274
3275 // xinef: cant block while casting or while stunned
3276 if (blockChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3277 blockChance = 0;
3278
3279 tmp += blockChance;
3280 if (roll < tmp)
3281 return SPELL_MISS_BLOCK;
3282 }
3283
3284 return SPELL_MISS_NONE;
3285}
@ CREATURE_FLAG_EXTRA_NO_PARRY
Definition: CreatureData.h:48
@ CREATURE_FLAG_EXTRA_NO_DODGE
Definition: CreatureData.h:69
@ SPELL_AURA_MOD_EXPERTISE
Definition: SpellAuraDefines.h:303
@ SPELL_AURA_IGNORE_COMBAT_RESULT
Definition: SpellAuraDefines.h:265
@ SPELL_AURA_MOD_ENEMY_DODGE
Definition: SpellAuraDefines.h:314
@ SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
Definition: SpellAuraDefines.h:311
@ SPELL_ATTR0_CU_DIRECT_DAMAGE
Definition: SpellInfo.h:184
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
Definition: SpellInfo.h:193
@ SPELL_ATTR7_NO_ATTACK_PARRY
Definition: SharedDefines.h:665
@ SPELL_ATTR7_NO_ATTACK_DODGE
Definition: SharedDefines.h:664
@ SPELL_ATTR3_COMPLETELY_BLOCKED
Definition: SharedDefines.h:496
@ SPELL_MISS_PARRY
Definition: SharedDefines.h:1523
@ SPELL_MISS_DODGE
Definition: SharedDefines.h:1522
@ SPELL_MISS_BLOCK
Definition: SharedDefines.h:1524
float GetUnitDodgeChance() const
Definition: Unit.cpp:3600
float GetTotalAuraMultiplier(AuraType auratype) const
Definition: Unit.cpp:5868
float GetUnitParryChance() const
Definition: Unit.cpp:3617
float MeleeSpellMissChance(Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
Definition: Unit.cpp:18891

References BASE_ATTACK, CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, SpellInfo::DmgClass, CreatureTemplate::flags_extra, GetAuraEffectsByType(), Creature::GetCreatureTemplate(), GetLevel(), GetMaxSkillValueForLevel(), GetMechanicResistChance(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), Object::GetTypeId(), GetUnitBlockChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasAuraType(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, IsNonMeleeSpellCast(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_DODGE, MELEE_HIT_PARRY, MeleeSpellMissChance(), RANGED_ATTACK, SPELL_ATTR0_CU_DIRECT_DAMAGE, SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET, SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR3_COMPLETELY_BLOCKED, SPELL_ATTR7_NO_ATTACK_DODGE, SPELL_ATTR7_NO_ATTACK_PARRY, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_COMBAT_RESULT, SPELL_AURA_IGNORE_HIT_DIRECTION, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, SPELL_DAMAGE_CLASS_RANGED, SPELL_MISS_BLOCK, SPELL_MISS_DEFLECT, SPELL_MISS_DODGE, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_PARRY, SPELL_MISS_RESIST, Object::ToCreature(), Object::ToPlayer(), TYPEID_UNIT, UNIT_STATE_CONTROLLED, UNIT_STATE_STUNNED, urand(), and VICTIMSTATE_DODGE.

Referenced by SpellHitResult().

◆ MeleeSpellMissChance()

float Unit::MeleeSpellMissChance ( Unit const *  victim,
WeaponAttackType  attType,
int32  skillDiff,
uint32  spellId 
) const
18892{
18893 SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;
18894 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
18895 {
18896 return 0.0f;
18897 }
18898
18899 //calculate miss chance
18900 float missChance = victim->GetUnitMissChance(attType);
18901
18902 // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty
18903 if (!spellId && (attType != RANGED_ATTACK) && haveOffhandWeapon() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))
18904 {
18905 missChance += 19;
18906 }
18907
18908 // bonus from skills is 0.04%
18909 //miss_chance -= skillDiff * 0.04f;
18910 int32 diff = -skillDiff;
18911 if (victim->IsPlayer())
18912 missChance += diff > 0 ? diff * 0.04f : diff * 0.02f;
18913 else
18914 missChance += diff > 10 ? 1 + (diff - 10) * 0.4f : diff * 0.1f;
18915
18916 // Calculate hit chance
18917 float hitChance = 100.0f;
18918
18919 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
18920 if (spellId)
18921 {
18922 if (Player* modOwner = GetSpellModOwner())
18923 modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
18924 }
18925
18926 missChance -= hitChance - 100.0f;
18927
18928 if (attType == RANGED_ATTACK)
18929 missChance -= m_modRangedHitChance;
18930 else
18931 missChance -= m_modMeleeHitChance;
18932
18933 // Limit miss chance from 0 to 60%
18934 if (missChance < 0.0f)
18935 return 0.0f;
18936 if (missChance > 60.0f)
18937 return 60.0f;
18938 return missChance;
18939}

References CURRENT_MELEE_SPELL, GetSpellModOwner(), GetUnitMissChance(), SpellInfo::HasAttribute(), haveOffhandWeapon(), Object::IsPlayer(), m_currentSpells, m_modMeleeHitChance, m_modRangedHitChance, RANGED_ATTACK, SPELL_ATTR7_NO_ATTACK_MISS, SPELLMOD_RESIST_MISS_CHANCE, and sSpellMgr.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ ModifyAuraState()

void Unit::ModifyAuraState ( AuraStateType  flag,
bool  apply 
)
10424{
10425 if (apply)
10426 {
10427 if (!HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10428 {
10429 SetFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10430 Unit::AuraMap& tAuras = GetOwnedAuras();
10431 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10432 {
10433 if( (*itr).second->IsRemoved() )
10434 continue;
10435
10436 if( (*itr).second->GetSpellInfo()->CasterAuraState == flag )
10437 if( AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()) )
10438 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, true);
10439 }
10440 }
10441 }
10442 else
10443 {
10444 if (HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10445 {
10446 RemoveFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10447
10448 if (flag != AURA_STATE_ENRAGE) // enrage aura state triggering continues auras
10449 {
10450 Unit::AuraMap& tAuras = GetOwnedAuras();
10451 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10452 {
10453 if( (*itr).second->GetSpellInfo()->CasterAuraState == flag )
10454 if( AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()) )
10455 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, false);
10456 }
10457 }
10458 }
10459 }
10460}
@ AURA_EFFECT_HANDLE_REAL
Definition: SpellAuraDefines.h:42
@ AURA_STATE_ENRAGE
Definition: SharedDefines.h:1309
void SetFlag(uint16 index, uint32 newFlag)
Definition: Object.cpp:845
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition: Object.cpp:860
std::multimap< uint32, Aura * > AuraMap
Definition: Unit.h:635
AuraMap & GetOwnedAuras()
Definition: Unit.h:1256

References AURA_EFFECT_HANDLE_REAL, AURA_STATE_ENRAGE, Object::GetGUID(), GetOwnedAuras(), Object::HasFlag(), Object::RemoveFlag(), Object::SetFlag(), and UNIT_FIELD_AURASTATE.

Referenced by _ApplyAura(), _UnapplyAura(), ClearAllReactives(), Spell::finish(), debug_commandscript::HandleDebugSetAuraStateCommand(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), ProcDamageAndSpellFor(), Update(), and UpdateReactives().

◆ ModifyHealth()

int32 Unit::ModifyHealth ( int32  val)
14007{
14008 int32 gain = 0;
14009
14010 if (dVal == 0)
14011 return 0;
14012
14013 int32 curHealth = (int32)GetHealth();
14014
14015 int32 val = dVal + curHealth;
14016 if (val <= 0)
14017 {
14018 SetHealth(0);
14019 return -curHealth;
14020 }
14021
14022 int32 maxHealth = (int32)GetMaxHealth();
14023
14024 if (val < maxHealth)
14025 {
14026 SetHealth(val);
14027 gain = val - curHealth;
14028 }
14029 else if (curHealth != maxHealth)
14030 {
14031 SetHealth(maxHealth);
14032 gain = maxHealth - curHealth;
14033 }
14034
14035 return gain;
14036}

References GetHealth(), GetMaxHealth(), and SetHealth().

Referenced by DealDamage(), DealHeal(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::RegenerateHealth(), Player::RegenerateHealth(), npc_injured_patient::npc_injured_patientAI::Reset(), Spell::TakePower(), Aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ ModifyPower()

int32 Unit::ModifyPower ( Powers  power,
int32  val,
bool  withPowerUpdate = true 
)
14065{
14066 if (dVal == 0)
14067 return 0;
14068
14069 int32 gain = 0;
14070
14071 int32 curPower = (int32)GetPower(power);
14072
14073 int32 val = dVal + curPower;
14074 if (val <= 0)
14075 {
14076 SetPower(power, 0, withPowerUpdate);
14077 return -curPower;
14078 }
14079
14080 int32 maxPower = (int32)GetMaxPower(power);
14081
14082 if (val < maxPower)
14083 {
14084 SetPower(power, val, withPowerUpdate);
14085 gain = val - curPower;
14086 }
14087 else if (curPower != maxPower)
14088 {
14089 SetPower(power, maxPower, withPowerUpdate);
14090 gain = maxPower - curPower;
14091 }
14092
14093 if (GetAI())
14094 {
14095 GetAI()->OnPowerUpdate(power, gain, dVal, curPower);
14096 }
14097
14098 return gain;
14099}
virtual void OnPowerUpdate(Powers, int32, int32, uint32)
Definition: UnitAI.h:373
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition: Unit.cpp:15479

References GetAI(), GetMaxPower(), GetPower(), UnitAI::OnPowerUpdate(), and SetPower().

Referenced by CalcAbsorbResist(), spell_igb_cannon_blast::CalculatePower(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), EnergizeBySpell(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_kelthuzad_detonate_mana_aura::HandleScript(), boss_pathaleon_the_calculator::JustEngagedWith(), boss_curator::JustEngagedWith(), Pet::LoseHappiness(), ModifyPowerPct(), Creature::Regenerate(), RewardRage(), Pet::setDeathState(), Spell::TakePower(), Spell::TakeRunePower(), Aura::Update(), and boss_faction_championsAI::UpdateAI().

◆ ModifyPowerPct()

int32 Unit::ModifyPowerPct ( Powers  power,
float  pct,
bool  apply = true 
)
14103{
14104 float amount = (float)GetMaxPower(power);
14105 ApplyPercentModFloatVar(amount, pct, apply);
14106
14107 return ModifyPower(power, (int32)amount - (int32)GetMaxPower(power));
14108}

References ApplyPercentModFloatVar(), GetMaxPower(), and ModifyPower().

Referenced by AuraEffect::HandleAuraModIncreaseEnergyPercent().

◆ ModifyRedirectThreat()

void Unit::ModifyRedirectThreat ( int32  amount)
inline
void ModifyThreatPct(int32 amount)
Definition: ThreatMgr.h:308

References _redirectThreatInfo, and RedirectThreatInfo::ModifyThreatPct().

Referenced by spell_warr_vigilance::HandleAfterApply().

◆ ModSpellCastTime()

void Unit::ModSpellCastTime ( SpellInfo const *  spellProto,
int32 castTime,
Spell spell = nullptr 
)
Todo:
:(MadAgos) Eventually check and delete the bool argument
14887{
14888 if (!spellInfo || castTime < 0)
14889 return;
14890
14891 if (spellInfo->IsChanneled() && spellInfo->HasAura(SPELL_AURA_MOUNTED))
14892 return;
14893
14894 // called from caster
14895 if (Player* modOwner = GetSpellModOwner())
14897 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));
14898
14899 switch (spellInfo->DmgClass)
14900 {
14902 if (spellInfo->AttributesEx5 & SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC) // required double check
14903 castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
14904 else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
14905 castTime = 500;
14906 break;
14908 break; // no known cases
14910 castTime = CanInstantCast() ? 0 : int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
14911 break;
14913 castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
14914 break;
14915 default:
14916 break;
14917 }
14918}
@ SPELLMOD_CASTING_TIME
Definition: SpellDefines.h:87
@ SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC
Definition: SharedDefines.h:580
bool CanInstantCast() const
Definition: Unit.h:1779

References SpellInfo::AttributesEx5, CanInstantCast(), SpellInfo::DmgClass, Object::GetFloatValue(), GetSpellModOwner(), SpellInfo::HasAura(), HasAura(), SpellInfo::Id, SpellInfo::IsChanneled(), IsPet(), m_modAttackSpeedPct, RANGED_ATTACK, SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC, SPELL_AURA_MOUNTED, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLMOD_CASTING_TIME, SpellInfo::SpellVisual, and UNIT_MOD_CAST_SPEED.

Referenced by SpellInfo::CalcCastTime().

◆ ModSpellDuration()

int32 Unit::ModSpellDuration ( SpellInfo const *  spellProto,
Unit const *  target,
int32  duration,
bool  positive,
uint32  effectMask 
)
14787{
14788 // don't mod permanent auras duration
14789 if (duration < 0)
14790 return duration;
14791
14792 // some auras are not affected by duration modifiers
14793 if (spellProto->HasAttribute(SPELL_ATTR7_NO_TARGET_DURATION_MOD))
14794 return duration;
14795
14796 // cut duration only of negative effects
14797 // xinef: also calculate self casts, spell can be reflected for example
14798 if (!positive)
14799 {
14800 int32 mechanic = spellProto->GetSpellMechanicMaskByEffectMask(effectMask);
14801
14802 int32 durationMod;
14803 int32 durationMod_always = 0;
14804 int32 durationMod_not_stack = 0;
14805
14806 for (uint8 i = 1; i <= MECHANIC_ENRAGED; ++i)
14807 {
14808 if (!(mechanic & 1 << i))
14809 continue;
14810
14811 // Xinef: spells affecting movement imparing effects should not reduce duration if disoriented mechanic is present
14812 if (i == MECHANIC_SNARE && (mechanic & (1 << MECHANIC_DISORIENTED)))
14813 continue;
14814
14815 // Find total mod value (negative bonus)
14816 int32 new_durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, i);
14817 // Find max mod (negative bonus)
14818 int32 new_durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, i);
14819 // Check if mods applied before were weaker
14820 if (new_durationMod_always < durationMod_always)
14821 durationMod_always = new_durationMod_always;
14822 if (new_durationMod_not_stack < durationMod_not_stack)
14823 durationMod_not_stack = new_durationMod_not_stack;
14824 }
14825
14826 // Select strongest negative mod
14827 if (durationMod_always > durationMod_not_stack)
14828 durationMod = durationMod_not_stack;
14829 else
14830 durationMod = durationMod_always;
14831
14832 if (durationMod != 0)
14833 AddPct(duration, durationMod);
14834
14835 // there are only negative mods currently
14836 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
14837 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
14838
14839 durationMod = 0;
14840 if (durationMod_always > durationMod_not_stack)
14841 durationMod += durationMod_not_stack;
14842 else
14843 durationMod += durationMod_always;
14844
14845 if (durationMod != 0)
14846 AddPct(duration, durationMod);
14847 }
14848 else
14849 {
14850 // else positive mods here, there are no currently
14851 // when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
14852 }
14853
14854 // Glyphs which increase duration of selfcasted buffs
14855 if (target == this)
14856 {
14857 switch (spellProto->SpellFamilyName)
14858 {
14859 case SPELLFAMILY_DRUID:
14860 if (spellProto->SpellFamilyFlags[0] & 0x100)
14861 {
14862 // Glyph of Thorns
14863 if (AuraEffect* aurEff = GetAuraEffect(57862, 0))
14864 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14865 }
14866 break;
14868 if ((spellProto->SpellFamilyFlags[0] & 0x00000002) && spellProto->SpellIconID == 298)
14869 {
14870 // Glyph of Blessing of Might
14871 if (AuraEffect* aurEff = GetAuraEffect(57958, 0))
14872 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14873 }
14874 else if ((spellProto->SpellFamilyFlags[0] & 0x00010000) && spellProto->SpellIconID == 306)
14875 {
14876 // Glyph of Blessing of Wisdom
14877 if (AuraEffect* aurEff = GetAuraEffect(57979, 0))
14878 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14879 }
14880 break;
14881 }
14882 }
14883 return std::max(duration, 0);
14884}
constexpr auto MINUTE
Definition: Common.h:46
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK
Definition: SpellAuraDefines.h:309
@ SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK
Definition: SpellAuraDefines.h:297
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
Definition: SpellAuraDefines.h:308
@ SPELL_AURA_MECHANIC_DURATION_MOD
Definition: SpellAuraDefines.h:295
@ SPELL_ATTR7_NO_TARGET_DURATION_MOD
Definition: SharedDefines.h:642
@ MECHANIC_ENRAGED
Definition: SharedDefines.h:1356
@ MECHANIC_DISORIENTED
Definition: SharedDefines.h:1327

References AddPct(), SpellInfo::Dispel, GetAuraEffect(), GetMaxNegativeAuraModifierByMiscValue(), SpellInfo::GetSpellMechanicMaskByEffectMask(), GetTotalAuraModifierByMiscValue(), SpellInfo::HasAttribute(), IN_MILLISECONDS, MECHANIC_DISORIENTED, MECHANIC_ENRAGED, MECHANIC_SNARE, MINUTE, SPELL_ATTR7_NO_TARGET_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, SPELLFAMILY_DRUID, SPELLFAMILY_PALADIN, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

Referenced by Spell::DoSpellHitOnUnit(), and Spell::EffectInterruptCast().

◆ MonsterMoveWithSpeed()

◆ Mount()

void Unit::Mount ( uint32  mount,
uint32  vehicleId = 0,
uint32  creatureEntry = 0 
)
13387{
13388 if (mount)
13390
13392
13393 if (Player* player = ToPlayer())
13394 {
13395 sScriptMgr->AnticheatSetUnderACKmount(player);
13396
13397 // mount as a vehicle
13398 if (VehicleId)
13399 {
13400 if (CreateVehicleKit(VehicleId, creatureEntry))
13401 {
13402 GetVehicleKit()->Reset();
13403
13404 // Send others that we now have a vehicle
13406 data << GetPackGUID();
13407 data << uint32(VehicleId);
13408 SendMessageToSet(&data, true);
13409
13411 player->GetSession()->SendPacket(&data);
13412
13413 // mounts can also have accessories
13415 }
13416 }
13417
13418 // unsummon pet
13419 Pet* pet = player->GetPet();
13420 if (pet)
13421 {
13423 // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface
13424 if (bg && bg->isArena())
13426 else
13427 player->UnsummonPetTemporaryIfAny();
13428 }
13429
13430 // xinef: if we have charmed npc, stun him also
13431 if (Unit* charm = player->GetCharm())
13432 if (charm->GetTypeId() == TYPEID_UNIT)
13433 charm->SetUnitFlag(UNIT_FLAG_STUNNED);
13434
13435 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13436 data << GetPackGUID();
13437 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13438 data << player->GetCollisionHeight();
13439 player->GetSession()->SendPacket(&data);
13440 }
13441
13443}
@ AURA_INTERRUPT_FLAG_MOUNT
Definition: SpellDefines.h:61
bool isArena() const
Definition: Battleground.h:396
bool CreateVehicleKit(uint32 id, uint32 creatureEntry)
Definition: Unit.cpp:18618
void Reset(bool evading=false)
Definition: Vehicle.cpp:116
void InstallAllAccessories(bool evading)
Definition: Vehicle.cpp:83

References AURA_INTERRUPT_FLAG_MOUNT, CreateVehicleKit(), Player::GetBattleground(), GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), Vehicle::InstallAllAccessories(), Battleground::isArena(), RemoveAurasWithInterruptFlags(), Vehicle::Reset(), WorldObject::SendMessageToSet(), SetUInt32Value(), SetUnitFlag(), SMSG_MOVE_SET_COLLISION_HGT, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), TYPEID_UNIT, UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, and UNIT_FLAG_STUNNED.

Referenced by AuraEffect::HandleAuraMounted(), spell_mount_check_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyMountCommand(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::JustRespawned(), Creature::LoadCreaturesAddon(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), npc_scarlet_courier::npc_scarlet_courierAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), WorldSession::SendDoFlight(), and npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached().

◆ NearTeleportTo() [1/2]

void Unit::NearTeleportTo ( float  x,
float  y,
float  z,
float  orientation,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19890{
19891 DisableSpline();
19892 if (IsPlayer())
19893 ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | (removeTransport ? 0 : TELE_TO_NOT_LEAVE_TRANSPORT) | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0) | (vehicleTeleport ? TELE_TO_NOT_LEAVE_VEHICLE : 0) | (withPet ? TELE_TO_WITH_PET : 0));
19894 else
19895 {
19896 Position pos = {x, y, z, orientation};
19897 SendTeleportPacket(pos);
19898 UpdatePosition(x, y, z, orientation, true);
19901 }
19902}
@ TELE_TO_WITH_PET
Definition: Player.h:827
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition: Player.h:826
@ TELE_TO_SPELL
Definition: Player.h:825
@ TELE_TO_NOT_LEAVE_COMBAT
Definition: Player.h:823
@ TELE_TO_NOT_UNSUMMON_PET
Definition: Player.h:824
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition: Player.h:822
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition: Player.cpp:1329
void SendTeleportPacket(Position &pos)
Definition: Unit.cpp:19911
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition: Unit.cpp:19033
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition: Unit.cpp:19930
void ReinitializeMovement()
Definition: MotionMaster.cpp:850

References DisableSpline(), WorldLocation::GetMapId(), GetMotionMaster(), Object::IsPlayer(), MotionMaster::ReinitializeMovement(), SendTeleportPacket(), TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, Player::TeleportTo(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdatePosition().

◆ NearTeleportTo() [2/2]

void Unit::NearTeleportTo ( Position pos,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19885{
19886 NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), casting, vehicleTeleport, withPet, removeTransport);
19887}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition: Unit.cpp:19884

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and NearTeleportTo().

Referenced by boss_viscidus::DamageTaken(), npc_madrigosa::npc_madrigosaAI::DoAction(), npc_akama_illidan::npc_akama_illidanAI::DoAction(), Spell::EffectLeap(), Spell::EffectResurrectPet(), Spell::EffectStuck(), Spell::EffectSummonPet(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), npc_giant_claw_tentacle::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnterEvadeMode(), boss_zuljin::boss_zuljinAI::EnterPhase(), UtherBatteredHiltEvent::Execute(), BattlegroundBE::HandleAreaTrigger(), BattlegroundDS::HandleAreaTrigger(), BattlegroundNA::HandleAreaTrigger(), BattlegroundRL::HandleAreaTrigger(), BattlegroundRV::HandleAreaTrigger(), spell_moroes_vanish::HandleDummy(), spell_class_call_handler::HandleOnHitRogue(), npc_echo_of_medivh::HandlePieceJustDied(), BattlegroundBE::HandlePlayerUnderMap(), BattlegroundDS::HandlePlayerUnderMap(), BattlegroundNA::HandlePlayerUnderMap(), BattlegroundRL::HandlePlayerUnderMap(), BattlegroundRV::HandlePlayerUnderMap(), npc_pet_mage_mirror_image::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_grandmaster_vorpil::JustEngagedWith(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), NearTeleportTo(), npc_akama_illidan::npc_akama_illidanAI::npc_akama_illidanAI(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_chesspiece::OnCharmed(), npc_vh_sinclari::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), boss_gothik::boss_gothikAI::Reset(), Map::ScriptsProcess(), npc_midsummer_torch_target::SelectPosition(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), boss_urom::boss_uromAI::SpellHit(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), npc_pos_leader_second::npc_pos_leader_secondAI::SpellHitTarget(), boss_cyanigosa::boss_cyanigosaAI::SpellHitTarget(), BattlegroundRV::TeleportUnitToNewZ(), Vehicle::TeleportVehicle(), npc_doomfire_spirit::TryTeleportInDirection(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), and npc_minigob_manabonk::UpdateAI().

◆ OutDebugInfo()

void Unit::OutDebugInfo ( ) const
20138{
20139 LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
20140 LOG_INFO("entities.unit", "GUID {}, name {}", GetGUID().ToString(), GetName());
20141 LOG_INFO("entities.unit", "OwnerGUID {}, MinionGUID {}, CharmerGUID {}, CharmedGUID {}",
20143 LOG_INFO("entities.unit", "In world {}, unit type mask {}", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
20144 if (IsInWorld())
20145 LOG_INFO("entities.unit", "Mapid {}", GetMapId());
20146
20147 LOG_INFO("entities.unit", "Summon Slot: ");
20148 for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
20149 LOG_INFO("entities.unit", "{}, ", m_SummonSlot[i].ToString());
20150 LOG_INFO("server.loading", " ");
20151
20152 LOG_INFO("entities.unit", "Controlled List: ");
20153 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20154 LOG_INFO("entities.unit", "{}, ", (*itr)->GetGUID().ToString());
20155 LOG_INFO("server.loading", " ");
20156
20157 LOG_INFO("entities.unit", "Aura List: ");
20158 for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
20159 LOG_INFO("entities.unit", "{}, ", itr->first);
20160 LOG_INFO("server.loading", " ");
20161
20162 if (IsVehicle())
20163 {
20164 LOG_INFO("entities.unit", "Passenger List: ");
20165 for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
20166 if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
20167 LOG_INFO("entities.unit", "{}, ", passenger->GetGUID().ToString());
20168 LOG_INFO("server.loading", " ");
20169 }
20170
20171 if (GetVehicle())
20172 LOG_INFO("entities.unit", "On vehicle {}.", GetVehicleBase()->GetEntry());
20173}
Seats
Definition: boss_flame_leviathan.cpp:167

References GetCharmerGUID(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), GetMinionGUID(), WorldObject::GetName(), GetOwnerGUID(), ObjectAccessor::GetUnit(), GetVehicle(), GetVehicleBase(), GetVehicleKit(), Object::IsInWorld(), IsVehicle(), LOG_ERROR, LOG_INFO, m_appliedAuras, m_Controlled, m_SummonSlot, m_unitTypeMask, MAX_SUMMON_SLOT, and Position::ToString().

Referenced by SetMinion().

◆ PatchValuesUpdate()

void Unit::PatchValuesUpdate ( ByteBuffer valuesUpdateBuf,
BuildValuesCachePosPointers posPointers,
Player target 
)
private
20726{
20727 Creature const* creature = ToCreature();
20728
20729 // UNIT_NPC_FLAGS
20730 if (creature && posPointers.UnitNPCFlagsPos >= 0)
20731 {
20732 uint32 appendValue = m_uint32Values[UNIT_NPC_FLAGS];
20733
20734 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && appendValue & UNIT_NPC_FLAG_FLIGHTMASTER)
20735 appendValue |= UNIT_NPC_FLAG_GOSSIP; // flight masters need NPC gossip flag to show instant flight toggle option
20736
20737 if (!target->CanSeeSpellClickOn(creature))
20738 appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
20739
20740 if (!target->CanSeeVendor(creature))
20741 appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK;
20742
20743 if (!creature->IsValidTrainerForPlayer(target, &appendValue))
20744 appendValue &= ~UNIT_NPC_FLAG_TRAINER;
20745
20746 valuesUpdateBuf.put(posPointers.UnitNPCFlagsPos, appendValue);
20747 }
20748
20749 // UNIT_FIELD_AURASTATE
20750 if (posPointers.UnitFieldAuraStatePos >= 0)
20751 valuesUpdateBuf.put(posPointers.UnitFieldAuraStatePos, uint32(BuildAuraStateUpdateForTarget(target)));
20752
20753 // UNIT_FIELD_FLAGS
20754 if (posPointers.UnitFieldFlagsPos >= 0)
20755 {
20756 uint32 appendValue = m_uint32Values[UNIT_FIELD_FLAGS];
20757 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20758 appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
20759
20760 valuesUpdateBuf.put(posPointers.UnitFieldFlagsPos, appendValue);
20761 }
20762
20763 // UNIT_FIELD_DISPLAYID
20764 // Use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures.
20765 if (posPointers.UnitFieldDisplayPos >= 0)
20766 {
20768 if (creature)
20769 {
20770 CreatureTemplate const* cinfo = creature->GetCreatureTemplate();
20771
20772 // this also applies for transform auras
20773 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm()))
20774 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
20775 if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM))
20776 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue))
20777 {
20778 cinfo = transformInfo;
20779 break;
20780 }
20781
20783 {
20784 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20785 {
20786 displayId = cinfo->GetFirstVisibleModel()->CreatureDisplayID;
20787 }
20788 else
20789 {
20790 displayId = cinfo->GetFirstInvisibleModel()->CreatureDisplayID;
20791 }
20792 }
20793 }
20794
20795 valuesUpdateBuf.put(posPointers.UnitFieldDisplayPos, uint32(displayId));
20796 }
20797
20798 // UNIT_DYNAMIC_FLAGS
20799 // Hide lootable animation for unallowed players.
20800 if (posPointers.UnitDynamicFlagsPos >= 0)
20801 {
20803
20804 if (creature)
20805 {
20806 if (creature->hasLootRecipient())
20807 {
20808 dynamicFlags |= UNIT_DYNFLAG_TAPPED;
20809 if (creature->isTappedBy(target))
20810 dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER;
20811 }
20812
20813 if (!target->isAllowedToLoot(creature))
20814 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
20815 }
20816
20817 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
20818 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
20820 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
20821
20822 valuesUpdateBuf.put(posPointers.UnitDynamicFlagsPos, dynamicFlags);
20823 }
20824
20825 // UNIT_FIELD_BYTES_2
20826 if (posPointers.UnitFieldBytes2Pos >= 0)
20827 {
20828 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20829 {
20831 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20832 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20833 // Allow targetting opposite faction in party when enabled in config
20834 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !!
20835 }// pussywizard / Callmephil
20836 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20837 (this->IsPlayer() || this->GetTypeId() == TYPEID_UNIT || this->IsDynamicObject()))
20838 {
20839 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
20840 }
20841 }
20842
20843 // UNIT_FIELD_FACTIONTEMPLATE
20844 if (posPointers.UnitFieldFactionTemplatePos >= 0)
20845 {
20846 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20847 {
20849 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20850 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20851 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
20852 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20853 }// pussywizard / Callmephil
20854 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20855 (this->IsPlayer() || this->GetTypeId() == TYPEID_UNIT || this->IsDynamicObject()))
20856 {
20857 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20858 }
20859 }
20860
20861 sScriptMgr->OnPatchValuesUpdate(this, valuesUpdateBuf, posPointers, target);
20862}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition: CreatureData.h:53
@ CONFIG_INSTANT_TAXI
Definition: IWorld.h:386
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition: IWorld.h:80
@ UNIT_DYNFLAG_TRACK_UNIT
Definition: SharedDefines.h:3122
bool IsValidTrainerForPlayer(Player *player, uint32 *npcFlags=nullptr) const
Definition: Creature.cpp:1258
bool isTappedBy(Player const *player) const
Definition: Creature.cpp:1374
uint32 CreatureDisplayID
Definition: CreatureData.h:182
CreatureModel const * GetFirstInvisibleModel() const
Definition: Creature.cpp:162
CreatureModel const * GetFirstVisibleModel() const
Definition: Creature.cpp:172
bool isAllowedToLoot(Creature const *creature)
Definition: PlayerStorage.cpp:5635
bool CanSeeVendor(Creature const *creature) const
Definition: Player.cpp:14248
bool IsSpectator() const
Definition: Player.h:2552
bool CanSeeSpellClickOn(Creature const *creature) const
Definition: Player.cpp:14225
uint32 BuildAuraStateUpdateForTarget(Unit *target) const
Definition: Unit.cpp:10462
int32 UnitFieldFlagsPos
Definition: UnitUtils.h:99
int32 UnitFieldDisplayPos
Definition: UnitUtils.h:100
int32 UnitDynamicFlagsPos
Definition: UnitUtils.h:101
int32 UnitFieldAuraStatePos
Definition: UnitUtils.h:98
int32 UnitFieldFactionTemplatePos
Definition: UnitUtils.h:103
int32 UnitFieldBytes2Pos
Definition: UnitUtils.h:102
int32 UnitNPCFlagsPos
Definition: UnitUtils.h:97
bool IsGMAccount() const
Definition: WorldSession.cpp:181
void put(std::size_t pos, T value)
Definition: ByteBuffer.h:137

References BuildAuraStateUpdateForTarget(), Player::CanSeeSpellClickOn(), Player::CanSeeVendor(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, CONFIG_INSTANT_TAXI, CREATURE_FLAG_EXTRA_TRIGGER, CreatureModel::CreatureDisplayID, WorldObject::FindMap(), CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetFaction(), GetFactionTemplateEntry(), CreatureTemplate::GetFirstInvisibleModel(), CreatureTemplate::GetFirstVisibleModel(), Object::GetGUID(), Player::GetSession(), getTransForm(), HasAuraTypeWithCaster(), Creature::hasLootRecipient(), Player::isAllowedToLoot(), Map::IsBattleArena(), IsControlledByPlayer(), FactionTemplateEntry::IsFriendlyTo(), Player::IsGameMaster(), WorldSession::IsGMAccount(), IsInRaidWith(), Player::IsSpectator(), Creature::isTappedBy(), Creature::IsValidTrainerForPlayer(), Object::m_uint32Values, MAX_SPELL_EFFECTS, ByteBuffer::put(), sObjectMgr, SPELL_AURA_MOD_STALKED, SPELL_AURA_TRANSFORM, sScriptMgr, sSpellMgr, sWorld, Object::ToCreature(), TYPEID_UNIT, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_DYNFLAG_TRACK_UNIT, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, and BuildValuesCachePosPointers::UnitNPCFlagsPos.

Referenced by BuildValuesUpdate().

◆ PauseMovement()

void Unit::PauseMovement ( uint32  timer = 0,
uint8  slot = 0 
)
virtual
16584{
16585 if (slot >= MAX_MOTION_SLOT)
16586 return;
16587
16588 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16589 movementGenerator->Pause(timer);
16590
16591 StopMoving();
16592}
@ MAX_MOTION_SLOT
Definition: MotionMaster.h:64
void StopMoving()
Definition: Unit.cpp:16564
Definition: MovementGenerator.h:30

References GetMotionMaster(), MAX_MOTION_SLOT, and StopMoving().

Referenced by WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::SendListInventory(), and boss_shade_of_aran::SetGUID().

◆ PetSpellFail()

void Unit::PetSpellFail ( SpellInfo const *  spellInfo,
Unit target,
uint32  result 
)
20234{
20235 CharmInfo* charmInfo = GetCharmInfo();
20236 if (!charmInfo || GetTypeId() != TYPEID_UNIT)
20237 return;
20238
20240 {
20241 if ((result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE) || !ToCreature()->HasReactState(REACT_PASSIVE))
20242 if (Unit* owner = GetOwner())
20243 {
20244 if (spellInfo->IsPositive() && IsFriendlyTo(target))
20245 {
20246 AttackStop();
20247 charmInfo->SetIsAtStay(false);
20248 charmInfo->SetIsCommandAttack(true);
20249 charmInfo->SetIsReturning(false);
20250 charmInfo->SetIsFollowing(false);
20251
20252 GetMotionMaster()->MoveFollow(target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI);
20253 }
20254 else if (owner->IsValidAttackTarget(target))
20255 {
20256 AttackStop();
20257 charmInfo->SetIsAtStay(false);
20258 charmInfo->SetIsCommandAttack(true);
20259 charmInfo->SetIsReturning(false);
20260 charmInfo->SetIsFollowing(false);
20261
20262 if (!ToCreature()->HasReactState(REACT_PASSIVE))
20263 ToCreature()->AI()->AttackStart(target);
20264 else
20265 GetMotionMaster()->MoveChase(target);
20266 }
20267 }
20268
20269 // can be extended in future
20270 if (result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE)
20271 {
20272 charmInfo->SetForcedSpell(spellInfo->IsPositive() ? -int32(spellInfo->Id) : spellInfo->Id);
20273 charmInfo->SetForcedTargetGUID(target->GetGUID());
20274 }
20275 else
20276 {
20277 charmInfo->SetForcedSpell(0);
20279 }
20280 }
20281}
#define PET_FOLLOW_DIST
Definition: PetDefines.h:198
@ SPELL_FAILED_OUT_OF_RANGE
Definition: SharedDefines.h:1046
@ SPELL_FAILED_LINE_OF_SIGHT
Definition: SharedDefines.h:996
bool IsPathfindingEnabled(const Map *map)
Definition: DisableMgr.cpp:411
virtual void AttackStart(Unit *)
Definition: UnitAI.cpp:27
void SetIsAtStay(bool val)
Definition: CharmInfo.cpp:365
void SetIsFollowing(bool val)
Definition: CharmInfo.cpp:375
void SetIsReturning(bool val)
Definition: CharmInfo.cpp:385
void SetForcedSpell(uint32 id)
Definition: CharmInfo.h:175
void SetForcedTargetGUID(ObjectGuid guid=ObjectGuid::Empty)
Definition: CharmInfo.h:177
void SetIsCommandAttack(bool val)
Definition: CharmInfo.cpp:303
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Definition: MotionMaster.cpp:300
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true)
Definition: MotionMaster.cpp:394

References Creature::AI(), UnitAI::AttackStart(), AttackStop(), ObjectGuid::Empty, GetCharmInfo(), Object::GetGUID(), WorldObject::GetMap(), GetMotionMaster(), GetOwner(), Object::GetTypeId(), SpellInfo::Id, IsFriendlyTo(), DisableMgr::IsPathfindingEnabled(), SpellInfo::IsPositive(), MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_DIST, rand_norm(), REACT_PASSIVE, CharmInfo::SetForcedSpell(), CharmInfo::SetForcedTargetGUID(), CharmInfo::SetIsAtStay(), CharmInfo::SetIsCommandAttack(), CharmInfo::SetIsFollowing(), CharmInfo::SetIsReturning(), SPELL_FAILED_LINE_OF_SIGHT, SPELL_FAILED_OUT_OF_RANGE, Object::ToCreature(), and TYPEID_UNIT.

Referenced by WorldSession::HandlePetActionHelper(), and WorldSession::HandlePetCastSpellOpcode().

◆ ProcDamageAndSpell()

void Unit::ProcDamageAndSpell ( Unit actor,
Unit victim,
uint32  procAttacker,
uint32  procVictim,
uint32  procEx,
uint32  amount,
WeaponAttackType  attType = BASE_ATTACK,
SpellInfo const *  procSpellInfo = nullptr,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
static
6323{
6324 // Not much to do if no flags are set.
6325 if (procAttacker && actor)
6326 actor->ProcDamageAndSpellFor(false, victim, procAttacker, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6327 // Now go on with a victim's events'n'auras
6328 // Not much to do if no flags are set or there is no victim
6329 if (victim && victim->IsAlive() && procVictim)
6330 victim->ProcDamageAndSpellFor(true, actor, procVictim, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6331}

References IsAlive(), and ProcDamageAndSpellFor().

Referenced by Spell::_cast(), Spell::_handle_finish_phase(), AttackerStateUpdate(), Spell::DoAllEffectOnTarget(), ReflectEvent::Execute(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and Kill().

◆ ProcDamageAndSpellFor()

void Unit::ProcDamageAndSpellFor ( bool  isVictim,
Unit target,
uint32  procFlag,
uint32  procExtra,
WeaponAttackType  attType,
SpellInfo const *  procSpellInfo,
uint32  damage,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
15969{
15970 // Player is loaded now - do not allow passive spell casts to proc
15971 if (IsPlayer() && ToPlayer()->GetSession()->PlayerLoading())
15972 return;
15973 // For melee/ranged based attack need update skills and set some Aura states if victim present
15974 if (procFlag & MELEE_BASED_TRIGGER_MASK && target && procPhase == PROC_SPELL_PHASE_HIT)
15975 {
15976 // Xinef: Shaman in ghost wolf form cant proc anything melee based
15977 if (!isVictim && GetShapeshiftForm() == FORM_GHOSTWOLF)
15978 return;
15979
15980 // Update skills here for players
15981 // only when you are not fighting other players or their pets/totems (pvp)
15982 if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())
15983 {
15984 // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)
15986 {
15987 ToPlayer()->UpdateCombatSkills(target, attType, isVictim, procSpell ? procSpell->m_weaponItem : nullptr);
15988 }
15989 // Update defence if player is victim and we block - TODO: confirm that blocked attacks only have a chance to increase defence skill
15990 else if (isVictim && procExtra & (PROC_EX_BLOCK))
15991 {
15992 ToPlayer()->UpdateCombatSkills(target, attType, true);
15993 }
15994 }
15995 // If exist crit/parry/dodge/block need update aura state (for victim and attacker)
15997 {
15998 // for victim
15999 if (isVictim)
16000 {
16001 // if victim and dodge attack
16002 if (procExtra & PROC_EX_DODGE)
16003 {
16004 // Update AURA_STATE on dodge
16005 if (!IsClass(CLASS_ROGUE, CLASS_CONTEXT_ABILITY_REACTIVE)) // skip Rogue Riposte
16006 {
16009 }
16010 }
16011 // if victim and parry attack
16012 if (procExtra & PROC_EX_PARRY)
16013 {
16014 // For Hunters only Counterattack (skip Mongoose bite)
16016 {
16019 }
16020 else
16021 {
16024 }
16025 }
16026 // if and victim block attack
16027 if (procExtra & PROC_EX_BLOCK)
16028 {
16031 }
16032 }
16033 else // For attacker
16034 {
16035 // Overpower on victim dodge
16036 if (procExtra & PROC_EX_DODGE)
16037 {
16039 {
16040 AddComboPoints(target, 1);
16042 }
16043 }
16044
16045 // Wolverine Bite
16046 if ((procExtra & PROC_HIT_CRITICAL) && IsHunterPet())
16047 {
16048 AddComboPoints(target, 1);
16050 }
16051 }
16052 }
16053 }
16054
16055 Unit* actor = isVictim ? target : this;
16056 Unit* actionTarget = !isVictim ? target : this;
16057
16058 ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, procPhase, procExtra, procSpell, damageInfo, healInfo, procAura, procAuraEffectIndex);
16059
16060 ProcTriggeredList procTriggered;
16061 // Fill procTriggered list
16062 for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16063 {
16064 // Do not allow auras to proc from effect triggered by itself
16065 if (procAura && procAura->Id == itr->first)
16066 continue;
16067
16068 // Xinef: Generic Item Equipment cooldown, -1 is a special marker
16069 if (itr->second->GetBase()->GetCastItemGUID() && HasSpellItemCooldown(itr->first, uint32(-1)))
16070 continue;
16071
16072 ProcTriggeredData triggerData(itr->second->GetBase());
16073 // Defensive procs are active on absorbs (so absorption effects are not a hindrance)
16074 bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
16075 if (isVictim)
16076 procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY;
16077
16078 SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
16079
16080 // only auras that have trigger spell should proc from fully absorbed damage
16081 if (procExtra & PROC_EX_ABSORB && isVictim)
16082 if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell)
16083 active = true;
16084
16085 // xinef: fix spell procing from damaging / healing casts if spell has DoT / HoT effect only
16086 // only player spells are taken into account
16087 if (!active && !isVictim && !(procFlag & PROC_FLAG_DONE_PERIODIC) && procSpellInfo && procSpellInfo->SpellFamilyName && (procSpellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) || procSpellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL)))
16088 active = true;
16089
16090 // AuraScript Hook
16091 if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
16092 {
16093 continue;
16094 }
16095
16096 bool isTriggeredAtSpellProcEvent = IsTriggeredAtSpellProcEvent(target, triggerData.aura, attType, isVictim, active, triggerData.spellProcEvent, eventInfo);
16097
16098 // AuraScript Hook
16099 if (!triggerData.aura->CallScriptAfterCheckProcHandlers(itr->second, eventInfo, isTriggeredAtSpellProcEvent))
16100 {
16101 continue;
16102 }
16103
16104 // do checks using conditions table
16105 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
16106 ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
16107 if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
16108 {
16109 continue;
16110 }
16111
16112 // Triggered spells not triggering additional spells
16113 //bool triggered = !spellProto->HasAttribute(SPELL_ATTR3_CAN_PROC_FROM_PROCS) ?
16114 // (procExtra & PROC_EX_INTERNAL_TRIGGERED && !(procFlag & PROC_FLAG_DONE_TRAP_ACTIVATION)) : false;
16115
16116 bool hasTriggeredProc = false;
16117 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
16118 {
16119 if (itr->second->HasEffect(i))
16120 {
16121 AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i);
16122
16123 // Skip this auras
16124 if (isNonTriggerAura[aurEff->GetAuraType()])
16125 continue;
16126
16127 // If not trigger by default and spellProcEvent == nullptr - skip
16128 if (!isTriggerAura[aurEff->GetAuraType()] && !triggerData.spellProcEvent)
16129 continue;
16130
16131 switch (aurEff->GetAuraType())
16132 {
16135 case SPELL_AURA_DUMMY:
16137 if (uint32 triggerSpellId = aurEff->GetSpellInfo()->Effects[i].TriggerSpell)
16138 {
16139 triggerData.triggerSpelId[i] = triggerSpellId;
16140 hasTriggeredProc = true;
16141 }
16142 break;
16143 default:
16144 break;
16145 }
16146
16147 // Some spells must always trigger
16148 //if (isAlwaysTriggeredAura[aurEff->GetAuraType()])
16149 triggerData.effMask |= 1 << i;
16150 }
16151 }
16152
16153 if (triggerData.effMask)
16154 {
16155 // If there is aura that triggers another proc aura, make sure that the triggered one is going to be proccessed on top of it
16156 if (hasTriggeredProc)
16157 {
16158 bool proccessed = false;
16159 for (uint8 i = 0; i < EFFECT_ALL; ++i)
16160 {
16161 if (uint32 triggeredSpellId = triggerData.triggerSpelId[i])
16162 {
16163 auto iter = std::find(procTriggered.begin(), procTriggered.end(), triggeredSpellId);
16164 if (iter != procTriggered.end())
16165 {
16166 std::advance(iter, 1);
16167 procTriggered.insert(iter, triggerData);
16168 proccessed = true;
16169 break;
16170 }
16171 }
16172 }
16173
16174 if (!proccessed)
16175 {
16176 procTriggered.push_front(triggerData);
16177 }
16178 }
16179 else
16180 {
16181 procTriggered.push_front(triggerData);
16182 }
16183 }
16184 }
16185
16186 // Nothing found
16187 if (procTriggered.empty())
16188 return;
16189
16190 // Note: must SetCantProc(false) before return
16192 SetCantProc(true);
16193
16194 // Handle effects proceed this time
16195 for (ProcTriggeredList::const_iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
16196 {
16197 // look for aura in auras list, it may be removed while proc event processing
16198 if (i->aura->IsRemoved())
16199 continue;
16200
16201 bool useCharges = i->aura->IsUsingCharges();
16202 // no more charges to use, prevent proc
16203 if (useCharges && !i->aura->GetCharges())
16204 continue;
16205
16206 bool takeCharges = false;
16207 SpellInfo const* spellInfo = i->aura->GetSpellInfo();
16208
16209 AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
16210
16211 bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
16212
16213 // For players set spell cooldown if need
16214 uint32 cooldown = 0;
16215 if (prepare && i->spellProcEvent && i->spellProcEvent->cooldown)
16216 cooldown = i->spellProcEvent->cooldown;
16217
16218 // Xinef: set cooldown for actual proc
16219 eventInfo.SetProcCooldown(cooldown);
16220
16221 // Note: must SetCantProc(false) before return
16223 SetCantProc(true);
16224
16225 bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
16226
16227 // "handled" is needed as long as proc can be handled in multiple places
16228 if (!handled && HandleAuraProc(target, damage, i->aura, procSpellInfo, procFlag, procExtra, cooldown, &handled))
16229 {
16230 uint32 Id = i->aura->GetId();
16231 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
16232 takeCharges = true;
16233 }
16234
16235 if (!handled)
16236 for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
16237 {
16238 if (!(i->effMask & (1 << effIndex)))
16239 continue;
16240
16241 AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
16242 ASSERT(triggeredByAura);
16243
16244 bool prevented = i->aura->CallScriptEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16245 if (prevented)
16246 {
16247 takeCharges = true;
16248 continue;
16249 }
16250
16251 switch (triggeredByAura->GetAuraType())
16252 {
16254 {
16255 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16256 // Don`t drop charge or add cooldown for not started trigger
16257 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16258 takeCharges = true;
16259 break;
16260 }
16262 {
16263 // target has to be valid
16264 if (!eventInfo.GetProcTarget())
16265 break;
16266
16267 triggeredByAura->HandleProcTriggerDamageAuraProc(aurApp, eventInfo); // this function is part of the new proc system
16268 takeCharges = true;
16269 break;
16270 }
16272 case SPELL_AURA_DUMMY:
16273 {
16274 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} dummy aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16275 if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
16276 takeCharges = true;
16277 break;
16278 }
16283 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
16284 takeCharges = true;
16285 break;
16287 {
16288 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16289 if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpellInfo, cooldown))
16290 takeCharges = true;
16291 break;
16292 }
16294 {
16295 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16296 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16297 if (damage > 0)
16298 {
16300 takeCharges = true;
16301 }
16302 break;
16303 }
16305 {
16306 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16307 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16308 HandleAuraRaidProcFromCharge(triggeredByAura);
16309 takeCharges = true;
16310 break;
16311 }
16313 {
16314 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16315
16316 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16317 takeCharges = true;
16318 break;
16319 }
16321 // Skip melee hits or instant cast spells
16322 // xinef: check channeled spells which are affected by haste also
16323 if (procSpellInfo && (procSpellInfo->SpellFamilyName || GetTypeId() != TYPEID_PLAYER) &&
16324 (procSpellInfo->CalcCastTime() > 0 /*||
16325 (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/))
16326 takeCharges = true;
16327 break;
16329 // Skip Melee hits and spells ws wrong school
16330 if (procSpellInfo && (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16331 takeCharges = true;
16332 break;
16334 // Skip Melee hits and targets with magnet aura
16335 if (procSpellInfo && (triggeredByAura->GetBase()->GetUnitOwner()->ToUnit() == ToUnit())) // Magnet
16336 takeCharges = true;
16337 break;
16340 // Skip melee hits and spells ws wrong school or zero cost
16341 if (procSpellInfo &&
16342 (procSpellInfo->ManaCost != 0 || procSpellInfo->ManaCostPercentage != 0 || (procSpellInfo->SpellFamilyFlags[1] & 0x2)) && // Cost check, mutilate include
16343 (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16344 takeCharges = true;
16345 break;
16348 // Compare mechanic
16349 if (procSpellInfo && procSpellInfo->Mechanic == uint32(triggeredByAura->GetMiscValue()))
16350 takeCharges = true;
16351 break;
16353 // Compare casters
16354 if (target && triggeredByAura->GetCasterGUID() == target->GetGUID())
16355 takeCharges = true;
16356 break;
16357 // CC Auras which use their amount amount to drop
16358 // Are there any more auras which need this?
16364 {
16365 // Spell own direct damage at apply wont break the CC
16366 // Xinef: Or when the aura is at full duration (assume that such auras should be added at the end, skipping all damage procs etc.)
16367 if (procSpellInfo)
16368 if ((!i->aura->IsPermanent() && i->aura->GetDuration() == i->aura->GetMaxDuration()) || procSpellInfo->Id == triggeredByAura->GetId() ||
16369 procSpellInfo->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
16370 break;
16371
16372 // chargeable mods are breaking on hit
16373 if (useCharges)
16374 takeCharges = true;
16375 else if (triggeredByAura->GetAmount()) // aura must have amount
16376 {
16377 int32 damageLeft = triggeredByAura->GetAmount();
16378 // No damage left
16379 if (damageLeft < int32(damage))
16380 i->aura->Remove();
16381 else
16382 triggeredByAura->SetAmount(damageLeft - damage);
16383 }
16384 break;
16385 }
16387 if (procSpellInfo && procSpellInfo->Id == 20647) // hack for warriors execute, both dummy and damage spell are affected by ignore aurastate aura
16388 break;
16389 takeCharges = true;
16390 break;
16393 {
16394 if (triggeredByAura->GetSpellModifier())
16395 {
16396 // Do proc if mod is consumed by spell
16397 if (!procSpell || procSpell->m_appliedMods.find(i->aura) != procSpell->m_appliedMods.end())
16398 {
16399 takeCharges = true;
16400 }
16401 }
16402 break;
16403 }
16404 default:
16405 takeCharges = true;
16406 break;
16407 }
16408 i->aura->CallScriptAfterEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16409 }
16410 // Remove charge (aura can be removed by triggers)
16411 // xinef: take into account attribute6 of proc spell
16412 if (prepare && useCharges && takeCharges)
16413 if (!procSpellInfo || isVictim || !procSpellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
16414 i->aura->DropCharge();
16415
16416 i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
16417
16419 SetCantProc(false);
16420 }
16421
16422 // Cleanup proc requirements
16424 SetCantProc(false);
16425}
@ REACTIVE_OVERPOWER
Definition: Unit.h:590
@ REACTIVE_DEFENSE
Definition: Unit.h:588
@ REACTIVE_HUNTER_PARRY
Definition: Unit.h:589
@ REACTIVE_WOLVERINE_BITE
Definition: Unit.h:591
static bool isNonTriggerAura[TOTAL_AURAS]
Definition: Unit.cpp:105
static bool isTriggerAura[TOTAL_AURAS]
Definition: Unit.cpp:103
std::list< ProcTriggeredData > ProcTriggeredList
Definition: Unit.cpp:15768
@ SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
Definition: SpellAuraDefines.h:288
@ SPELL_AURA_ADD_PCT_MODIFIER
Definition: SpellAuraDefines.h:171
@ SPELL_AURA_OBS_MOD_POWER
Definition: SpellAuraDefines.h:84
@ SPELL_AURA_ADD_FLAT_MODIFIER
Definition: SpellAuraDefines.h:170
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:120
@ SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
Definition: SpellAuraDefines.h:135
@ SPELL_AURA_MOD_POWER_COST_SCHOOL
Definition: SpellAuraDefines.h:136
@ SPELL_AURA_MECHANIC_IMMUNITY
Definition: SpellAuraDefines.h:140
@ SPELL_AURA_RAID_PROC_FROM_CHARGE
Definition: SpellAuraDefines.h:286
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
Definition: SpellAuraDefines.h:106
@ SPELL_AURA_REFLECT_SPELLS_SCHOOL
Definition: SpellAuraDefines.h:137
@ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:128
@ PROC_HIT_CRITICAL
Definition: SpellMgr.h:253
#define MELEE_BASED_TRIGGER_MASK
Definition: SpellMgr.h:182
@ PROC_EX_INTERNAL_CANT_PROC
Definition: SpellMgr.h:218
@ PROC_EX_INTERNAL_TRIGGERED
Definition: SpellMgr.h:221
@ PROC_FLAG_DONE_PERIODIC
Definition: SpellMgr.h:134
@ CONDITION_SOURCE_TYPE_SPELL_PROC
Definition: ConditionMgr.h:146
@ EFFECT_2
Definition: SharedDefines.h:33
@ SPELL_ATTR3_INSTANT_TARGET_PROCS
Definition: SharedDefines.h:512
#define EFFECT_ALL
Definition: SharedDefines.h:38
@ SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES
Definition: SharedDefines.h:609
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition: PlayerUpdates.cpp:980
Definition: Unit.cpp:15749
Definition: Unit.h:420
void SetProcCooldown(uint32 cooldown)
Definition: Unit.h:454
Unit * GetActionTarget() const
Definition: Unit.h:440
Unit * GetProcTarget() const
Definition: Unit.h:441
bool HandleProcTriggerSpell(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
Definition: Unit.cpp:8869
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect *triggeredByAura)
Definition: Unit.cpp:17465
bool IsHunterPet() const
Definition: Unit.h:754
bool IsTriggeredAtSpellProcEvent(Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
Definition: Unit.cpp:17326
bool HandleAuraProc(Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
Definition: Unit.cpp:8674
virtual bool HasSpellItemCooldown(uint32, uint32) const
Definition: Unit.h:1761
bool HandleDummyAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
Definition: Unit.cpp:6533
void StartReactiveTimer(ReactiveType reactive)
Definition: Unit.h:1655
bool HandleOverrideClassScriptAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
Definition: Unit.cpp:9796
bool HandleAuraRaidProcFromCharge(AuraEffect *triggeredByAura)
Definition: Unit.cpp:17554
bool IsCharmedOwnedByPlayerOrPlayer() const
Definition: Unit.h:1180
void HandleProcTriggerDamageAuraProc(AuraApplication *aurApp, ProcEventInfo &eventInfo)
Definition: SpellAuraEffects.cpp:7252
SpellModifier * GetSpellModifier() const
Definition: SpellAuraEffects.h:52
Unit * GetUnitOwner() const
Definition: SpellAuras.h:108

References AddComboPoints(), ASSERT, ProcTriggeredData::aura, AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, SpellInfo::CalcCastTime(), Aura::CallScriptAfterCheckProcHandlers(), Aura::CallScriptCheckProcHandlers(), CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_ROGUE, CLASS_WARRIOR, CONDITION_SOURCE_TYPE_SPELL_PROC, EFFECT_0, EFFECT_1, EFFECT_2, EFFECT_ALL, SpellInfo::Effects, ProcTriggeredData::effMask, FORM_GHOSTWOLF, ProcEventInfo::GetActionTarget(), ProcEventInfo::GetActor(), AuraEffect::GetAmount(), GetAppliedAuras(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), AuraEffect::GetCasterGUID(), Aura::GetEffect(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), ProcEventInfo::GetProcTarget(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), AuraEffect::GetSpellModifier(), Object::GetTypeId(), Aura::GetUnitOwner(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandleProcTriggerDamageAuraProc(), HandleProcTriggerSpell(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpellItemCooldown(), SpellInfo::Id, IsCharmedOwnedByPlayerOrPlayer(), IsClass(), IsHunterPet(), isNonTriggerAura, Object::IsPlayer(), isTriggerAura, IsTriggeredAtSpellProcEvent(), LOG_DEBUG, Spell::m_appliedMods, Spell::m_weaponItem, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, MELEE_BASED_TRIGGER_MASK, ModifyAuraState(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_INTERNAL_CANT_PROC, PROC_EX_INTERNAL_TRIGGERED, PROC_EX_MISS, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_PERIODIC, PROC_HIT_CRITICAL, PROC_SPELL_PHASE_HIT, REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, REACTIVE_WOLVERINE_BITE, SpellInfo::SchoolMask, sConditionMgr, AuraEffect::SetAmount(), SetCantProc(), ProcEventInfo::SetProcCooldown(), SPELL_ATTR3_INSTANT_TARGET_PROCS, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES, SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELL_AURA_ADD_FLAT_MODIFIER, SPELL_AURA_ADD_PCT_MODIFIER, SPELL_AURA_DUMMY, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MECHANIC_IMMUNITY, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_MECHANIC_RESISTANCE, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_MOD_POWER_COST_SCHOOL, SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_STUN, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_DAMAGE, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_AURA_RAID_PROC_FROM_CHARGE, SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_AURA_SPELL_MAGNET, SPELL_AURA_TRANSFORM, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, ProcTriggeredData::spellProcEvent, StartReactiveTimer(), Object::ToPlayer(), Object::ToUnit(), ProcTriggeredData::triggerSpelId, TYPEID_PLAYER, and Player::UpdateCombatSkills().

Referenced by CalcAbsorbResist(), and ProcDamageAndSpell().

◆ processDummyAuras()

float Unit::processDummyAuras ( float  TakenTotalMod) const
private
11824{
11825 // note: old code coming from TC, just extracted here to remove the code duplication + solve potential crash
11826 // see: https://github.com/TrinityCore/TrinityCore/commit/c85710e148d75450baedf6632b9ca6fd40b4148e
11827
11828 // .. taken pct: dummy auras
11829 auto const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
11830 for (auto i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
11831 {
11832 if (!(*i) || !(*i)->GetSpellInfo())
11833 {
11834 continue;
11835 }
11836
11837 if (auto spellIconId = (*i)->GetSpellInfo()->SpellIconID)
11838 {
11839 switch (spellIconId)
11840 {
11841 // Cheat Death
11842 case 2109:
11843 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
11844 {
11845 // Patch 2.4.3: The resilience required to reach the 90% damage reduction cap
11846 // is 22.5% critical strike damage reduction, or 444 resilience.
11847 // To calculate for 90%, we multiply the 100% by 4 (22.5% * 4 = 90%)
11848 float mod = -1.0f * GetMeleeCritDamageReduction(400);
11849 AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
11850 }
11851 break;
11852 }
11853 }
11854 }
11855 return TakenTotalMod;
11856}

References AddPct(), GetAuraEffectsByType(), GetMeleeCritDamageReduction(), SPELL_AURA_DUMMY, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by MeleeDamageBonusTaken(), and SpellDamageBonusTaken().

◆ ProcessPositionDataChanged()

void Unit::ProcessPositionDataChanged ( PositionFullTerrainStatus const &  data)
overridevirtual

Reimplemented from WorldObject.

4213{
4216}
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const &data)
Definition: Object.cpp:1163
virtual void ProcessTerrainStatusUpdate()
Definition: Unit.cpp:4218

References WorldObject::ProcessPositionDataChanged(), and ProcessTerrainStatusUpdate().

Referenced by Creature::Create().

◆ ProcessTerrainStatusUpdate()

void Unit::ProcessTerrainStatusUpdate ( )
virtual

Reimplemented in Player.

4219{
4220 if (GetTypeId() == TYPEID_UNIT)
4222
4223 if (IsFlying() || (!IsControlledByPlayer()))
4224 return;
4225
4226 LiquidData const& liquidData = GetLiquidData();
4227
4228 // remove appropriate auras if we are swimming/not swimming respectively
4229 if (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING)
4231 else if (!isSwimming())
4233
4234 // liquid aura handling
4235 LiquidTypeEntry const* curLiquid = nullptr;
4236 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING))
4237 curLiquid = sLiquidTypeStore.LookupEntry(liquidData.Entry);
4238
4239 if (curLiquid != _lastLiquid)
4240 {
4243
4244 // Set _lastLiquid before casting liquid spell to avoid infinite loops
4245 _lastLiquid = curLiquid;
4246
4248 if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
4249 CastSpell(this, curLiquid->SpellId, true);
4250 }
4251}
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition: SpellDefines.h:51
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition: SpellDefines.h:52
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
void UpdateMovementFlags()
Definition: Creature.cpp:3391
bool isSwimming() const
Definition: Unit.h:1725
bool IsFlying() const
Definition: Unit.h:1727
Definition: Map.h:171
uint32 Entry
Definition: Map.h:174
Definition: DBCStructure.h:1283
uint32 SpellId
Definition: DBCStructure.h:1289

References _lastLiquid, AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, CastSpell(), LiquidData::Entry, GetCharmerOrOwnerPlayerOrPlayerItself(), WorldObject::GetLiquidData(), Object::GetTypeId(), IsControlledByPlayer(), IsFlying(), Player::IsGameMaster(), isSwimming(), MAP_LIQUID_STATUS_SWIMMING, RemoveAurasDueToSpell(), RemoveAurasWithInterruptFlags(), sLiquidTypeStore, LiquidTypeEntry::SpellId, LiquidData::Status, Object::ToCreature(), TYPEID_UNIT, and Creature::UpdateMovementFlags().

Referenced by ProcessPositionDataChanged(), and Player::ProcessTerrainStatusUpdate().

◆ ProhibitSpellSchool()

virtual void Unit::ProhibitSpellSchool ( SpellSchoolMask  ,
uint32   
)
inlinevirtual

Reimplemented in Creature, and Player.

1390{ }

Referenced by Spell::EffectInterruptCast().

◆ propagateSpeedChange()

void Unit::propagateSpeedChange ( )
inline

-------—End of Pet responses methods-------—

void propagateSpeedChange()
Definition: MotionMaster.cpp:836

References GetMotionMaster(), and MotionMaster::propagateSpeedChange().

Referenced by SetSpeed(), and SetWalk().

◆ RecalculateObjectScale()

void Unit::RecalculateObjectScale ( )
virtual
16669{
16671 float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras);
16672 float scaleMin = IsPlayer() ? 0.1f : 0.01f;
16673 SetObjectScale(std::max(scale, scaleMin));
16674}
@ SPELL_AURA_MOD_SCALE_2
Definition: SpellAuraDefines.h:302
@ SPELL_AURA_MOD_SCALE
Definition: SpellAuraDefines.h:124
virtual void SetObjectScale(float scale)
Definition: Object.h:116
virtual float GetNativeObjectScale() const
Definition: Unit.h:1508

References CalculatePct(), GetNativeObjectScale(), GetTotalAuraModifier(), Object::IsPlayer(), Object::SetObjectScale(), SPELL_AURA_MOD_SCALE, and SPELL_AURA_MOD_SCALE_2.

Referenced by AuraEffect::HandleAuraModScale().

◆ RemoveAllAttackers()

void Unit::RemoveAllAttackers ( )
10411{
10412 while (!m_attackers.empty())
10413 {
10414 AttackerSet::iterator iter = m_attackers.begin();
10415 if (!(*iter)->AttackStop())
10416 {
10417 LOG_ERROR("entities.unit", "WORLD: Unit has an attacker that isn't attacking it!");
10418 m_attackers.erase(iter);
10419 }
10420 }
10421}

References LOG_ERROR, and m_attackers.

Referenced by CombatStop(), Spell::EffectSanctuary(), AuraEffect::HandleFeignDeath(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), and npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI().

◆ RemoveAllAuras()

void Unit::RemoveAllAuras ( )
5264{
5265 // this may be a dead loop if some events on aura remove will continiously apply aura on remove
5266 // we want to have all auras removed, so use your brain when linking events
5267 while (!m_appliedAuras.empty() || !m_ownedAuras.empty())
5268 {
5269 AuraApplicationMap::iterator aurAppIter;
5270 for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();)
5272
5273 AuraMap::iterator aurIter;
5274 for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();)
5275 RemoveOwnedAura(aurIter);
5276 }
5277}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by CleanupBeforeRemoveFromMap(), npc_mograine::npc_mograineAI::DamageTaken(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_taldaram::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), boss_leotheras_the_blind::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), boss_razorgore::boss_razorgoreAI::DoChangePhase(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), spell_herald_volzaj_insanity::HandleDummyEffect(), misc_commandscript::HandleUnAuraCommand(), boss_ick::boss_ickAI::JustDied(), boss_venoxis::JustDied(), boss_taldaram::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_commander_stoutbeard::boss_commander_stoutbeardAI::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustReachedHome(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustReachedHome(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustReachedHome(), boss_urom::boss_uromAI::LeaveCombat(), boss_taldaram::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), spell_kaelthas_flame_strike::OnRemove(), PretendToDie(), boss_alar::PretendToDie(), Creature::RemoveCorpse(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), boss_venoxis::Reset(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_hodir::boss_hodirAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_skadi::boss_skadiAI::Reset(), boss_skadi_grauf::boss_skadi_graufAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), Pet::SavePetToDB(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), npc_harrison_jones::npc_harrison_jonesAI::SpellHit(), npc_frost_sphere::npc_frost_sphereAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_magus_telestra::boss_magus_telestraAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and npc_aeranas::npc_aeranasAI::UpdateAI().

◆ RemoveAllAurasExceptType()

void Unit::RemoveAllAurasExceptType ( AuraType  type)
5338{
5339 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5340 {
5341 Aura const* aura = iter->second->GetBase();
5342 if (aura->GetSpellInfo()->HasAura(type))
5343 ++iter;
5344 else
5346 }
5347
5348 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5349 {
5350 Aura* aura = iter->second;
5351 if (aura->GetSpellInfo()->HasAura(type))
5352 ++iter;
5353 else
5355 }
5356}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), SpellInfo::HasAura(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ RemoveAllAurasOnDeath()

void Unit::RemoveAllAurasOnDeath ( )
5294{
5295 // used just after dieing to remove all visible auras
5296 // and disable the mods for the passive ones
5297 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5298 {
5299 Aura const* aura = iter->second->GetBase();
5302 else
5303 ++iter;
5304 }
5305
5306 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5307 {
5308 Aura* aura = iter->second;
5311 else
5312 ++iter;
5313 }
5314}
@ AURA_REMOVE_BY_DEATH
Definition: SpellAuraDefines.h:396
@ SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD
Definition: SharedDefines.h:643
bool IsDeathPersistent() const
Definition: SpellAuras.cpp:1087

References _UnapplyAura(), AURA_REMOVE_BY_DEATH, Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsDeathPersistent(), Aura::IsPassive(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), and SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD.

Referenced by spell_dk_death_pact::FilterTargets(), Kill(), Player::LoadFromDB(), and setDeathState().

◆ RemoveAllAurasRequiringDeadTarget()

void Unit::RemoveAllAurasRequiringDeadTarget ( )
5317{
5318 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5319 {
5320 Aura const* aura = iter->second->GetBase();
5321 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5323 else
5324 ++iter;
5325 }
5326
5327 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5328 {
5329 Aura* aura = iter->second;
5330 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5332 else
5333 ++iter;
5334 }
5335}
bool IsRequiringDeadTarget() const
Definition: SpellInfo.cpp:1221

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), Aura::IsPassive(), SpellInfo::IsRequiringDeadTarget(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by Player::LoadFromDB().

◆ RemoveAllControlled()

void Unit::RemoveAllControlled ( bool  onDeath = false)
11008{
11009 // possessed pet and vehicle
11010 if (IsPlayer())
11012
11013 while (!m_Controlled.empty())
11014 {
11015 Unit* target = *m_Controlled.begin();
11016 m_Controlled.erase(m_Controlled.begin());
11017 if (target->GetCharmerGUID() == GetGUID())
11018 {
11019 target->RemoveCharmAuras();
11020 }
11021 else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
11022 {
11023 if (!(onDeath && !IsPlayer() && target->IsGuardian()))
11024 {
11025 target->ToTempSummon()->UnSummon();
11026 }
11027 }
11028 else
11029 {
11030 LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
11031 }
11032 }
11033}
void StopCastingCharm(Aura *except=nullptr)
Definition: Player.cpp:9250
bool IsGuardian() const
Definition: Unit.h:751
void RemoveCharmAuras()
Definition: Unit.cpp:11118

References GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), IsGuardian(), Object::IsPlayer(), IsSummon(), LOG_ERROR, m_Controlled, RemoveCharmAuras(), Player::StopCastingCharm(), Object::ToPlayer(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ RemoveAllDynObjects()

void Unit::RemoveAllDynObjects ( )
6108{
6109 while (!m_dynObj.empty())
6110 m_dynObj.front()->Remove();
6111}

References m_dynObj.

Referenced by RemoveFromWorld(), Player::TeleportTo(), and npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI().

◆ RemoveAllGameObjects()

void Unit::RemoveAllGameObjects ( )
6208{
6209 while(!m_gameObj.empty())
6210 {
6211 GameObject* go = ObjectAccessor::GetGameObject(*this, *m_gameObj.begin());
6212 if(go)
6213 {
6215 go->SetRespawnTime(0);
6216 go->Delete();
6217 }
6218 m_gameObj.erase(m_gameObj.begin());
6219 }
6220}
void Delete()
Definition: GameObject.cpp:979
void SetRespawnTime(int32 respawn)
Definition: GameObject.cpp:1303

References GameObject::Delete(), ObjectGuid::Empty, ObjectAccessor::GetGameObject(), m_gameObj, GameObject::SetOwnerGUID(), and GameObject::SetRespawnTime().

Referenced by CleanupBeforeRemoveFromMap(), npc_ice_tomb::npc_ice_tombAI::JustDied(), RemoveFromWorld(), npc_brewfest_super_brew_trigger::UpdateAI(), and boss_sapphiron::boss_sapphironAI::UpdateAI().

◆ RemoveAllMinionsByEntry()

void Unit::RemoveAllMinionsByEntry ( uint32  entry)
10785{
10786 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10787 {
10788 Unit* unit = *itr;
10789 ++itr;
10790 if (unit->GetEntry() == entry && unit->GetTypeId() == TYPEID_UNIT
10791 && unit->ToCreature()->IsSummon()) // minion, actually
10792 unit->ToTempSummon()->UnSummon();
10793 // i think this is safe because i have never heard that a despawned minion will trigger a same minion
10794 }
10795}

References Object::GetEntry(), Object::GetTypeId(), IsSummon(), m_Controlled, Object::ToCreature(), ToTempSummon(), TYPEID_UNIT, and TempSummon::UnSummon().

Referenced by Player::ApplyEquipSpell(), Spell::EffectSummonType(), npc_nelson::npc_nelsonAI::Reset(), SetMinion(), and npc_nelson::npc_nelsonAI::UpdateAI().

◆ RemoveAppliedAuras() [1/2]

void Unit::RemoveAppliedAuras ( std::function< bool(AuraApplication const *)> const &  check)
4826{
4827 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
4828 {
4829 if (check(iter->second))
4830 {
4831 RemoveAura(iter);
4832 continue;
4833 }
4834 ++iter;
4835 }
4836}

References m_appliedAuras, and RemoveAura().

Referenced by RemoveArenaAuras().

◆ RemoveAppliedAuras() [2/2]

void Unit::RemoveAppliedAuras ( uint32  spellId,
std::function< bool(AuraApplication const *)> const &  check 
)
4852{
4853 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4854 {
4855 if (check(iter->second))
4856 {
4857 RemoveAura(iter);
4858 continue;
4859 }
4860 ++iter;
4861 }
4862}

References m_appliedAuras, and RemoveAura().

◆ RemoveAreaAurasDueToLeaveWorld()

void Unit::RemoveAreaAurasDueToLeaveWorld ( )
5231{
5232 // make sure that all area auras not applied on self are removed - prevent access to deleted pointer later
5233 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5234 {
5235 Aura* aura = iter->second;
5236 ++iter;
5237 Aura::ApplicationMap const& appMap = aura->GetApplicationMap();
5238 for (Aura::ApplicationMap::const_iterator itr = appMap.begin(); itr != appMap.end();)
5239 {
5240 AuraApplication* aurApp = itr->second;
5241 ++itr;
5242 Unit* target = aurApp->GetTarget();
5243 if (target == this)
5244 continue;
5245 target->RemoveAura(aurApp);
5246 // things linked on aura remove may apply new area aura - so start from the beginning
5247 iter = m_ownedAuras.begin();
5248 }
5249 }
5250
5251 // remove area auras owned by others
5252 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5253 {
5254 if (iter->second->GetBase()->GetOwner() != this)
5255 {
5256 RemoveAura(iter);
5257 }
5258 else
5259 ++iter;
5260 }
5261}
ApplicationMap const & GetApplicationMap()
Definition: SpellAuras.h:181
std::map< ObjectGuid, AuraApplication * > ApplicationMap
Definition: SpellAuras.h:90

References Aura::GetApplicationMap(), AuraApplication::GetTarget(), m_appliedAuras, m_ownedAuras, and RemoveAura().

Referenced by RemoveFromWorld().

◆ RemoveArenaAuras()

void Unit::RemoveArenaAuras ( )
5280{
5281 // in join, remove positive buffs, on end, remove negative
5282 // used to remove positive visible auras in arenas
5283 RemoveAppliedAuras([](AuraApplication const* aurApp)
5284 {
5285 Aura const* aura = aurApp->GetBase();
5286 return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_ALLOW_ENETRING_ARENA) // don't remove stances, shadowform, pally/hunter auras
5287 && !aura->IsPassive() // don't remove passive auras
5288 && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras
5289 aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove
5290 });
5291}
@ SPELL_ATTR5_REMOVE_ENTERING_ARENA
Definition: SharedDefines.h:569
@ SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD
Definition: SharedDefines.h:513
@ SPELL_ATTR4_ALLOW_ENETRING_ARENA
Definition: SharedDefines.h:551
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check)
Definition: Unit.cpp:4825
bool IsPositive() const
Definition: SpellAuras.h:68

References AuraApplication::GetBase(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsPassive(), AuraApplication::IsPositive(), RemoveAppliedAuras(), SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD, SPELL_ATTR4_ALLOW_ENETRING_ARENA, and SPELL_ATTR5_REMOVE_ENTERING_ARENA.

Referenced by Player::TeleportTo().

◆ RemoveAura() [1/4]

void Unit::RemoveAura ( Aura aur,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4805{
4806 if (aura->IsRemoved())
4807 return;
4808 if (AuraApplication* aurApp = aura->GetApplicationOfTarget(GetGUID()))
4809 RemoveAura(aurApp, mode);
4810}

References Aura::GetApplicationOfTarget(), Object::GetGUID(), Aura::IsRemoved(), and RemoveAura().

◆ RemoveAura() [2/4]

void Unit::RemoveAura ( AuraApplication aurApp,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4762{
4763 // we've special situation here, RemoveAura called while during aura removal
4764 // this kind of call is needed only when aura effect removal handler
4765 // or event triggered by it expects to remove
4766 // not yet removed effects of an aura
4767 if (aurApp->GetRemoveMode())
4768 {
4769 // remove remaining effects of an aura
4770 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4771 {
4772 if (aurApp->HasEffect(itr))
4773 aurApp->_HandleEffect(itr, false);
4774 }
4775 return;
4776 }
4777 // no need to remove
4778 if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
4779 return;
4780
4781 uint32 spellId = aurApp->GetBase()->GetId();
4782 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4783
4784 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4785 {
4786 if (aurApp == iter->second)
4787 {
4788 // Prevent Arena Preparation aura from being removed by player actions
4789 // It's an invisibility spell so any interaction/spell cast etc. removes it.
4790 // Should only be removed by the arena script, once the match starts.
4792 {
4793 return;
4794 }
4795
4796 RemoveAura(iter, mode);
4797 return;
4798 }
4799 else
4800 ++iter;
4801 }
4802}
@ SPELL_AURA_ARENA_PREPARATION
Definition: SpellAuraDefines.h:278

References AuraApplication::_HandleEffect(), Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), AuraApplication::GetRemoveMode(), AuraApplication::HasEffect(), Aura::HasEffectType(), Aura::IsRemoved(), m_appliedAuras, MAX_SPELL_EFFECTS, RemoveAura(), and SPELL_AURA_ARENA_PREPARATION.

◆ RemoveAura() [3/4]

void Unit::RemoveAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4732{
4733 AuraApplication* aurApp = i->second;
4734 // Do not remove aura which is already being removed
4735 if (aurApp->GetRemoveMode())
4736 return;
4737 Aura* aura = aurApp->GetBase();
4738 _UnapplyAura(i, mode);
4739 // Remove aura - for Area and Target auras
4740 if (aura->GetOwner() == this)
4741 aura->Remove(mode);
4742}

References _UnapplyAura(), AuraApplication::GetBase(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), and Aura::Remove().

Referenced by _RemoveNoStackAurasDueToAura(), boss_marli::_schedulePhaseTroll(), ApplySpellDispelImmunity(), Player::CheckAreaExploreAndOutdoor(), boss_gyth::boss_gythAI::DamageTaken(), boss_headless_horseman::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_hor_lich_king::npc_hor_lich_kingAI::DoAction(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_paletress::boss_paletressAI::DoAction(), boss_vezax::boss_vezaxAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DoAction(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::DoAction(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), Player::DuelComplete(), Spell::EffectDispelMechanic(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectSummonPet(), Spell::EffectTriggerSpell(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), GetDiseasesByCaster(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_q12096_q12092_bark::HandleDummy(), HandleDummyAuraProc(), spell_valanar_kinetic_bomb_aura::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_midsummer_ribbon_pole::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), spell_dk_presence::HandleEffectRemove(), spell_pal_blessing_of_sanctuary::HandleEffectRemove(), spell_sha_chain_heal::HandleHeal(), spell_sindragosa_frost_breath::HandleInfusion(), spell_warl_demonic_circle_summon::HandleRemove(), spell_putricide_eat_ooze::HandleScript(), AuraEffect::HandleShapeshiftBoosts(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_jaraxxus::boss_jaraxxusAI::JustEngagedWith(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::JustEngagedWith(), npc_ulduar_snow_mound::MoveInLineOfSight(), spell_blood_queen_vampiric_bite::OnCast(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), npc_essence_of_twin::OnGossipHello(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), npc_thrall_bfu::OnQuestReward(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), BattlefieldWG::PromotePlayer(), RemoveAppliedAuras(), RemoveAreaAurasDueToLeaveWorld(), RemoveAura(), RemoveAurasByShapeShift(), RemoveAurasByType(), RemoveAurasDueToItemSpell(), RemoveAurasDueToSpell(), RemoveAurasWithAttribute(), RemoveAurasWithFamily(), RemoveAurasWithInterruptFlags(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), BattlegroundIC::RemovePlayer(), BattlegroundMap::RemovePlayerFromMap(), boss_bjarngrim::boss_bjarngrimAI::RemoveStanceAura(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_marli::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), NPCStaveQuestAI::ResetState(), boss_anomalus::boss_anomalusAI::SetData(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_malygos::boss_malygosAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), boss_headless_horseman::SpellHit(), boss_viscidus::SpellHit(), spell_pal_hand_of_sacrifice_aura::Split(), boss_sartharion_shadron::boss_sartharion_shadronAI::SummonedCreatureDies(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_viscidus::UpdateAI(), boss_taldaram::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), Spell::UpdateChanneledTargetList(), and boss_bjarngrim::boss_bjarngrimAI::WaypointReached().

◆ RemoveAura() [4/4]

void Unit::RemoveAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4745{
4746 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4747 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4748 {
4749 Aura const* aura = iter->second->GetBase();
4750 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4751 && (!caster || aura->GetCasterGUID() == caster))
4752 {
4753 RemoveAura(iter, removeMode);
4754 return;
4755 }
4756 else
4757 ++iter;
4758 }
4759}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

◆ RemoveAuraFromStack()

void Unit::RemoveAuraFromStack ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4881{
4882 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4883 for (AuraMap::iterator iter = range.first; iter != range.second;)
4884 {
4885 Aura* aura = iter->second;
4886 if ((aura->GetType() == UNIT_AURA_TYPE)
4887 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4888 {
4889 aura->ModStackAmount(-1, removeMode);
4890 return;
4891 }
4892 else
4893 ++iter;
4894 }
4895}
@ UNIT_AURA_TYPE
Definition: SpellAuraDefines.h:385
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, bool periodicReset=false)
Definition: SpellAuras.cpp:1021
AuraObjectType GetType() const
Definition: SpellAuras.cpp:481

References Aura::GetCasterGUID(), Aura::GetType(), m_ownedAuras, Aura::ModStackAmount(), and UNIT_AURA_TYPE.

Referenced by Spell::EffectSchoolDMG(), HandleAuraProc(), HandleDummyAuraProc(), spell_putricide_gaseous_bloat_aura::HandleExtraEffect(), spell_oculus_evasive_maneuvers_aura::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_item_brittle_armor::HandleScript(), spell_item_mercurial_shield::HandleScript(), boss_viscidus::SpellHit(), and boss_selin_fireheart::UpdateAI().

◆ RemoveAurasByShapeShift()

void Unit::RemoveAurasByShapeShift ( )
5215{
5216 uint32 mechanic_mask = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT);
5217 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5218 {
5219 Aura const* aura = iter->second->GetBase();
5220 if ((aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask) &&
5222 {
5223 RemoveAura(iter);
5224 continue;
5225 }
5226 ++iter;
5227 }
5228}
@ SPELL_ATTR0_CU_AURA_CC
Definition: SpellInfo.h:181
uint32 GetAllEffectsMechanicMask() const
Definition: SpellInfo.cpp:1991

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), m_appliedAuras, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), SPELL_ATTR0_CU_AURA_CC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::HandleAuraModShapeshift().

◆ RemoveAurasByType()

void Unit::RemoveAurasByType ( AuraType  auraType,
ObjectGuid  casterGUID = ObjectGuid::Empty,
Aura except = nullptr,
bool  negative = true,
bool  positive = true 
)
5055{
5056 // simple check if list is empty
5057 if (m_modAuras[auraType].empty())
5058 return;
5059
5060 for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();)
5061 {
5062 Aura* aura = (*iter)->GetBase();
5064
5065 ++iter;
5066 if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5067 && ((negative && !aurApp->IsPositive()) || (positive && aurApp->IsPositive())))
5068 {
5069 uint32 removedAuras = m_removedAurasCount;
5070 RemoveAura(aurApp);
5071 if (m_removedAurasCount > removedAuras + 1)
5072 iter = m_modAuras[auraType].begin();
5073 }
5074 }
5075}

References Aura::GetApplicationOfTarget(), Aura::GetCasterGUID(), Object::GetGUID(), AuraApplication::IsPositive(), m_modAuras, m_removedAurasCount, and RemoveAura().

Referenced by _EnterVehicle(), Spell::_handle_finish_phase(), Player::ActivateTaxiPathTo(), Battleground::AddPlayer(), Attack(), spell_gen_summon_tournament_mount::CheckIfLanceEquiped(), ClearComboPoints(), Player::ContinueTaxiFlight(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), Spell::DoSpellHitOnUnit(), Spell::EffectPowerBurn(), Spell::EffectTriggerSpell(), BattlegroundWS::EventPlayerClickedOnFlag(), ExitVehicle(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItemsEvent(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModStateImmunity(), AuraEffect::HandleAuraMounted(), AuraEffect::HandleAuraTransform(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), HandleDummyAuraProc(), spell_rog_vanish::HandleEffect(), spell_hydross_mark_of_hydross::HandleEffectApply(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleListStabledPetsOpcode(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), WorldSession::HandleMoveWorldportAck(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_algalon_remove_phase_aura::HandlePeriodic(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSaveGuildEmblemOpcode(), spell_gen_mine_sweeper::HandleSchoolDMG(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::HandleUnstablePet(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::JustEngagedWith(), Player::LeaveBattleground(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), spell_gen_aura_service_uniform::OnApply(), Player::ProcessDelayedOperations(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Vehicle::RemoveAllPassengers(), RemoveBindSightAuras(), RemoveCharmAuras(), Battleground::RemovePlayerAtLeave(), WorldSession::SendDoFlight(), WorldSession::SendListInventory(), Player::SendLoot(), WorldSession::SendTrainerList(), SetCharmedBy(), Player::StopCastingCharm(), Player::TeleportTo(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), GameObject::Use(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ RemoveAurasDueToItemSpell()

void Unit::RemoveAurasDueToItemSpell ( uint32  spellId,
ObjectGuid  castItemGuid 
)
5041{
5042 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5043 {
5044 if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
5045 {
5046 RemoveAura(iter);
5047 iter = m_appliedAuras.lower_bound(spellId);
5048 }
5049 else
5050 ++iter;
5051 }
5052}

References m_appliedAuras, and RemoveAura().

Referenced by Player::ApplyEnchantment(), and Player::ApplyEquipSpell().

◆ RemoveAurasDueToSpell()

void Unit::RemoveAurasDueToSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4865{
4866 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4867 {
4868 Aura const* aura = iter->second->GetBase();
4869 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4870 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4871 {
4872 RemoveAura(iter, removeMode);
4873 iter = m_appliedAuras.lower_bound(spellId);
4874 }
4875 else
4876 ++iter;
4877 }
4878}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

Referenced by Spell::_cast(), Player::_removeTalentAurasAndSpells(), Player::ActivateSpec(), Vehicle::AddPassenger(), spell_commander_sarannis_arcane_devastation::AfterApply(), spell_dru_feral_swiftness::AfterRemove(), spell_dru_barkskin::AfterRemove(), spell_dru_savage_roar_aura::AfterRemove(), spell_dru_survival_instincts_aura::AfterRemove(), Player::ApplyEquipSpell(), boss_hakkar::boss_hakkarAI::ApplyHakkarPowerStacks(), boss_buru::ChaseNewVictim(), spell_eredar_twins_handle_touch::CheckCast(), boss_volazj::CheckPhaseMinions(), spell_botanica_shift_form_aura::CheckProc(), spell_mage_burning_determination::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), Player::CleanupAfterTaxiFlight(), AuraEffect::CleanupTriggeredSpells(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), spell_ruby_sanctum_rallying_shout::CountAllies(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_buru::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_leotheras_the_blind::DemonTime(), Player::DestroyItem(), npc_drakonid_spawner::DoAction(), npc_twilight_volunteer::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_frozen_core::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::boss_illidan_stormrageAI::DoAction(), npc_pet_gen_argent_pony_bridle::DoAction(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::DoTriggersOnSpellHit(), Spell::EffectApplyGlyph(), Spell::EffectHeal(), Spell::EffectRemoveAura(), Spell::EffectSchoolDMG(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_halazzi::EnterPhase(), boss_zuljin::boss_zuljinAI::EnterPhase(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), BattleExperienceEvent::Execute(), SendEncounterUnit::Execute(), FrostBombExplosion::Execute(), AuraRemoveEvent::Execute(), spell_sindragosa_ice_tomb_trap_aura::ExtraRemoveEffect(), spell_warr_improved_spell_reflection_trigger::FilterTargets(), lfg::LFGMgr::FinishDungeon(), spell_dru_berserk::HandleAfterCast(), spell_capacitus_polarity_charge_aura::HandleAfterRemove(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), boss_janalai::boss_janalaiAI::HandleBombSequence(), spell_moroes_vanish::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_warhead_detonate::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), HandleDummyAuraProc(), spell_magtheridon_shadow_grasp_visual::HandleDummyRemove(), spell_shadowfang_keep_forsaken_skills::spell_shadowfang_keep_forsaken_skills_AuraScript::HandleDummyTick(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_q12730_quenching_mist::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectRemove(), spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove(), spell_q10769_dissension_amongst_the_ranks_aura::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), spell_midsummer_fling_torch::HandleFinish(), gm_commandscript::HandleGMVisibleCommand(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), spell_transitus_shield_beam_aura::HandleOnEffectRemove(), OPvPCapturePointZM_GraveYard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_algalon_remove_phase_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), OutdoorPvPNA::HandlePlayerLeaveZone(), OutdoorPvPSI::HandlePlayerLeaveZone(), OutdoorPvPTF::HandlePlayerLeaveZone(), OutdoorPvPZM::HandlePlayerLeaveZone(), spell_gen_consume::HandleProc(), spell_pri_t4_4p_bonus::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), spell_icc_harvest_blight_specimen::HandleQuestComplete(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleRemove(), spell_dru_enrage::HandleRemove(), spell_pal_divine_intervention::HandleRemove(), spell_pal_avenging_wrath::HandleRemove(), spell_rog_killing_spree_aura::HandleRemove(), spell_warr_vigilance::HandleRemove(), WorldSession::HandleRemoveGlyph(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_putricide_clear_aura_effect_value::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_jump_remove_aura::HandleScript(), spell_icc_harvest_blight_specimen::HandleScript(), spell_festergut_pungent_blight::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_q10651_q10692_book_of_fel_names::HandleScript(), spell_halion_clear_debuffs::HandleScriptEffect(), spell_q12823_remove_collapsing_cave_aura::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), spell_capacitus_polarity_charge::HandleTargets(), misc_commandscript::HandleUnAuraCommand(), misc_commandscript::HandleUnFreezeCommand(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), npc_underbog_mushroom::InitializeAI(), npc_demon_chain::JustDied(), boss_azuregos::boss_azuregosAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_bronjahm::boss_bronjahmAI::JustEngagedWith(), boss_doomwalker::JustEngagedWith(), boss_gruul::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_buru::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), boss_garfrost::boss_garfrostAI::MovementInform(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), spell_halion_twilight_realm_aura::OnApply(), spell_halion_leave_twilight_realm_aura::OnApply(), spell_systems_shutdown_aura::OnApply(), npc_chesspiece::OnCharmed(), npc_eye_of_acherus::OnCharmed(), npc_aged_dying_ancient_kodo::OnGossipHello(), lfg::LFGPlayerScript::OnMapChanged(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_gen_curse_of_pain::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), BattlefieldWG::OnPlayerLeaveZone(), boss_shade_of_aran::OnPowerUpdate(), spell_halion_combustion_consumption_aura::OnRemove(), spell_halion_leave_twilight_realm_aura::OnRemove(), spell_algalon_phase_punch_aura::OnRemove(), spell_load_into_catapult_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), spell_hun_ascpect_of_the_viper::OnRemove(), spell_hun_viper_attack_speed::OnRemove(), spell_item_with_mount_speed::OnRemove(), spell_item_desperate_defense::OnRemove(), spell_item_shadowmourne::OnRemove(), spell_item_shadowmourne_soul_fragment::OnRemove(), spell_mage_combustion_proc::OnRemove(), spell_item_shadowmourne_soul_fragment::OnStackChange(), MidsummerPlayerScript::OnUpdateZone(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::PassengerBoarded(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::PassengerBoarded(), boss_jeklik::PathEndReached(), ProcessTerrainStatusUpdate(), spell_gen_defend::RefreshVisualShields(), RemoveAurasDueToSpellByDispel(), BattlefieldWG::RemoveAurasFromPlayer(), boss_festergut::boss_festergutAI::RemoveBlight(), spell_warl_health_funnel::RemoveEffect(), RemoveGameObject(), BattlegroundAV::RemovePlayer(), Battleground::RemovePlayerFromResurrectQueue(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), Pet::removeSpell(), Player::removeSpell(), spell_gen_eject_all_passengers::RemoveVehicleAuras(), spell_gen_defend::RemoveVisualShields(), boss_malchezaar::Reset(), npc_mograine::npc_mograineAI::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), boss_twilight_corrupter::Reset(), boss_nalorakk::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_thekal::Reset(), boss_cthun::Reset(), boss_viscidus::Reset(), boss_halion::boss_halionAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_leotheras_the_blind::Reset(), boss_lethon::boss_lethonAI::Reset(), boss_taerar::boss_taerarAI::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), Player::ResurrectPlayer(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_magtheridon::ScheduleCombatEvents(), boss_supremus::SchedulePhase(), boss_laj::ScheduleTasks(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), OPvPCapturePointZM_GraveYard::SetBeaconState(), boss_hydross_the_unstable::SetForm(), Player::SetGMVisible(), boss_mandokir::boss_mandokirAI::SetGUID(), Player::SetIsSpectator(), SetModelVisible(), npc_akama_shade::sGossipSelect(), boss_nalorakk::ShapeShift(), boss_viscidus::SoftReset(), boss_ossirian::SpellHit(), npc_omen::npc_omenAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), boss_moorabi::boss_moorabiAI::SpellHitTarget(), boss_festergut::boss_festergutAI::SpellHitTarget(), boss_ahune::Submerge(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_cthun::SummonedCreatureDies(), npc_kiljaeden_controller::npc_kiljaeden_controllerAI::SummonedCreatureDies(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonedCreatureDies(), boss_anzu::SummonedCreatureDies(), boss_viscidus::SummonedCreatureDies(), boss_terestian_illhoof::SummonKilrek(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), boss_netherspite::SwitchToBanishPhase(), boss_netherspite::SwitchToPortalPhase(), Totem::UnSummon(), spell_black_temple_spell_absorption_aura::Update(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_eye_of_acherus::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), npc_singularity::npc_singularityAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_moam::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_anzu::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_darting_hatchling::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ RemoveAurasDueToSpellByDispel()

void Unit::RemoveAurasDueToSpellByDispel ( uint32  spellId,
uint32  dispellerSpellId,
ObjectGuid  casterGUID,
Unit dispeller,
uint8  chargesRemoved = 1 
)
4898{
4899 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4900 for (AuraMap::iterator iter = range.first; iter != range.second;)
4901 {
4902 Aura* aura = iter->second;
4903 if (aura->GetCasterGUID() == casterGUID)
4904 {
4905 DispelInfo dispelInfo(dispeller, dispellerSpellId, chargesRemoved);
4906
4907 // Call OnDispel hook on AuraScript
4908 aura->CallScriptDispel(&dispelInfo);
4909
4911 aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
4912 else
4913 aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
4914
4915 // Call AfterDispel hook on AuraScript
4916 aura->CallScriptAfterDispel(&dispelInfo);
4917
4918 switch (aura->GetSpellInfo()->SpellFamilyName)
4919 {
4920 case SPELLFAMILY_HUNTER:
4921 {
4922 // Noxious Stings
4923 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000)
4924 {
4925 if (Unit* caster = aura->GetCaster())
4926 {
4927 if (AuraEffect* aureff = caster->GetAuraEffect(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_HUNTER, 3521, 1))
4928 {
4929 if (Aura* noxious = Aura::TryCreate(aura->GetSpellInfo(), aura->GetEffectMask(), dispeller, caster))
4930 {
4931 noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100);
4932 if (aura->GetUnitOwner() )
4933 if (const std::vector<int32>* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId())))
4934 for (std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr)
4935 aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr);
4936 }
4937 }
4938 }
4939 }
4940 break;
4941 }
4943 {
4944 // Icy Clutch, remove with Frost Fever
4945 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x4000000)
4946 {
4947 if (AuraEffect* aureff = GetAuraEffect(SPELL_AURA_MOD_DECREASE_SPEED, SPELLFAMILY_DEATHKNIGHT, 0, 0x40000, 0, casterGUID))
4948 RemoveAurasDueToSpell(aureff->GetId());
4949 }
4950 }
4951 default:
4952 break;
4953 }
4954 return;
4955 }
4956 else
4957 ++iter;
4958 }
4959}
Definition: Unit.h:296
void CallScriptDispel(DispelInfo *dispelInfo)
Definition: SpellAuras.cpp:2390
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition: SpellAuras.cpp:352
bool ModCharges(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: SpellAuras.cpp:973
void CallScriptAfterDispel(DispelInfo *dispelInfo)
Definition: SpellAuras.cpp:2403

References AURA_REMOVE_BY_ENEMY_SPELL, Aura::CallScriptAfterDispel(), Aura::CallScriptDispel(), GetAuraEffect(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetDuration(), Aura::GetEffectMask(), Aura::GetId(), DispelInfo::GetRemovedCharges(), Aura::GetSpellInfo(), Aura::GetUnitOwner(), SpellInfo::HasAttribute(), m_ownedAuras, Aura::ModCharges(), Aura::ModStackAmount(), RemoveAurasDueToSpell(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sSpellMgr, and Aura::TryCreate().

Referenced by Spell::EffectDispel().

◆ RemoveAurasDueToSpellBySteal()

void Unit::RemoveAurasDueToSpellBySteal ( uint32  spellId,
ObjectGuid  casterGUID,
Unit stealer 
)
4962{
4963 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4964 for (AuraMap::iterator iter = range.first; iter != range.second;)
4965 {
4966 Aura* aura = iter->second;
4967 if (aura->GetCasterGUID() == casterGUID)
4968 {
4969 int32 damage[MAX_SPELL_EFFECTS];
4970 int32 baseDamage[MAX_SPELL_EFFECTS];
4971 uint8 effMask = 0;
4972 uint8 recalculateMask = 0;
4973 Unit* caster = aura->GetCaster();
4974 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4975 {
4976 if (aura->GetEffect(i))
4977 {
4978 baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
4979 damage[i] = aura->GetEffect(i)->GetAmount();
4980 effMask |= (1 << i);
4981 if (aura->GetEffect(i)->CanBeRecalculated())
4982 recalculateMask |= (1 << i);
4983 }
4984 else
4985 {
4986 baseDamage[i] = 0;
4987 damage[i] = 0;
4988 }
4989 }
4990
4992 // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
4993 uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
4994
4995 if (Aura* oldAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
4996 {
4997 if (stealCharge)
4998 oldAura->ModCharges(1);
4999 else
5000 oldAura->ModStackAmount(1);
5001 oldAura->SetDuration(int32(dur));
5002 }
5003 else
5004 {
5005 // single target state must be removed before aura creation to preserve existing single target aura
5006 if (aura->IsSingleTarget())
5007 aura->UnregisterSingleTarget();
5008
5009 // Xinef: if stealer has same aura
5010 Aura* curAura = stealer->GetAura(aura->GetId());
5011 if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))
5012 if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, nullptr, &baseDamage[0], nullptr, aura->GetCasterGUID()))
5013 {
5014 // created aura must not be single target aura,, so stealer won't loose it on recast
5015 if (newAura->IsSingleTarget())
5016 {
5017 newAura->UnregisterSingleTarget();
5018 // bring back single target aura status to the old aura
5019 aura->SetIsSingleTarget(true);
5020 caster->GetSingleCastAuras().push_back(aura);
5021 }
5022 // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
5023 newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
5024 newAura->ApplyForTargets();
5025 }
5026 }
5027
5028 if (stealCharge)
5030 else
5032
5033 return;
5034 }
5035 else
5036 ++iter;
5037 }
5038}
bool CanBeRecalculated() const
Definition: SpellAuraEffects.h:78
int32 GetBaseAmount() const
Definition: SpellAuraEffects.h:57
void UnregisterSingleTarget()
Definition: SpellAuras.cpp:1167
bool IsPermanent() const
Definition: SpellAuras.h:139

References AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::CanBeRecalculated(), AuraEffect::GetAmount(), GetAura(), AuraEffect::GetBaseAmount(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetCharges(), Aura::GetDuration(), Aura::GetEffect(), Aura::GetId(), Aura::GetMaxDuration(), GetSingleCastAuras(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), IN_MILLISECONDS, Aura::IsPermanent(), Aura::IsSingleTarget(), m_ownedAuras, MAX_SPELL_EFFECTS, MINUTE, Aura::ModCharges(), Aura::ModStackAmount(), Aura::SetIsSingleTarget(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, Aura::TryRefreshStackOrCreate(), and Aura::UnregisterSingleTarget().

Referenced by Spell::EffectStealBeneficialBuff().

◆ RemoveAurasWithAttribute()

void Unit::RemoveAurasWithAttribute ( uint32  flags)
5078{
5079 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5080 {
5081 SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo();
5082 if (spell->Attributes & flags)
5083 RemoveAura(iter);
5084 else
5085 ++iter;
5086 }
5087}

References SpellInfo::Attributes, m_appliedAuras, and RemoveAura().

◆ RemoveAurasWithFamily()

void Unit::RemoveAurasWithFamily ( SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID 
)
5161{
5162 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5163 {
5164 Aura const* aura = iter->second->GetBase();
5165 if (!casterGUID || aura->GetCasterGUID() == casterGUID)
5166 {
5167 SpellInfo const* spell = aura->GetSpellInfo();
5168 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5169 {
5170 RemoveAura(iter);
5171 continue;
5172 }
5173 }
5174 ++iter;
5175 }
5176}

References Aura::GetCasterGUID(), Aura::GetSpellInfo(), flag96::HasFlag(), m_appliedAuras, RemoveAura(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by spell_warl_demonic_aegis::HandleAuraApply(), and Aura::HandleAuraSpecificMods().

◆ RemoveAurasWithInterruptFlags()

void Unit::RemoveAurasWithInterruptFlags ( uint32  flag,
uint32  except = 0,
bool  isAutoshot = false 
)
5126{
5127 if (!(m_interruptMask & flag))
5128 return;
5129
5130 // interrupt auras
5131 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end();)
5132 {
5133 Aura* aura = (*iter)->GetBase();
5134 ++iter;
5135 if ((aura->GetSpellInfo()->AuraInterruptFlags & flag) && (!except || aura->GetId() != except))
5136 {
5137 uint32 removedAuras = m_removedAurasCount;
5138 RemoveAura(aura);
5139 if (m_removedAurasCount > removedAuras + 1)
5140 iter = m_interruptableAuras.begin();
5141 }
5142 }
5143
5144 // interrupt channeled spell
5146 {
5147 if (spell->getState() == SPELL_STATE_CASTING && (spell->m_spellInfo->ChannelInterruptFlags & flag) && spell->m_spellInfo->Id != except)
5148 {
5149 // Do not interrupt if auto shot
5150 if (!(isAutoshot && spell->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)))
5151 {
5152 InterruptNonMeleeSpells(false, spell->m_spellInfo->Id);
5153 }
5154 }
5155 }
5156
5158}

References SpellInfo::AuraInterruptFlags, CURRENT_CHANNELED_SPELL, Aura::GetId(), Aura::GetSpellInfo(), InterruptNonMeleeSpells(), m_currentSpells, m_interruptableAuras, m_interruptMask, m_removedAurasCount, RemoveAura(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_CASTING, and UpdateInterruptMask().

Referenced by _EnterVehicle(), AttackerStateUpdate(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealDamage(), Dismount(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), spell_rog_killing_spree::FilterTargets(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleFeignDeath(), WorldSession::HandleGossipHelloOpcode(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModStealth(), AuraEffect::HandleModUnattackable(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePhase(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), Mount(), Spell::prepare(), ProcessTerrainStatusUpdate(), Player::SetInWater(), SetStandState(), Player::TeleportTo(), and UpdatePosition().

◆ RemoveAurasWithMechanic()

void Unit::RemoveAurasWithMechanic ( uint32  mechanic_mask,
AuraRemoveMode  removemode = AURA_REMOVE_BY_DEFAULT,
uint32  except = 0 
)
5198{
5199 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5200 {
5201 Aura const* aura = iter->second->GetBase();
5202 if (!except || aura->GetId() != except)
5203 {
5204 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask)
5205 {
5206 RemoveAura(iter, removemode);
5207 continue;
5208 }
5209 }
5210 ++iter;
5211 }
5212}

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetId(), Aura::GetSpellInfo(), m_appliedAuras, and RemoveAura().

Referenced by HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_rog_vanish_purge::HandleRootRemove(), spell_rog_vanish_purge::HandleSnareRemove(), and RemoveMovementImpairingAuras().

◆ RemoveBindSightAuras()

void Unit::RemoveBindSightAuras ( )
11114{
11116}
@ SPELL_AURA_BIND_SIGHT
Definition: SpellAuraDefines.h:64

References RemoveAurasByType(), and SPELL_AURA_BIND_SIGHT.

Referenced by RemoveFromWorld().

◆ RemoveCharmAuras()

void Unit::RemoveCharmAuras ( )
11119{
11124}
@ SPELL_AURA_MOD_POSSESS_PET
Definition: SpellAuraDefines.h:191
@ SPELL_AURA_MOD_CHARM
Definition: SpellAuraDefines.h:69
@ SPELL_AURA_AOE_CHARM
Definition: SpellAuraDefines.h:240
@ SPELL_AURA_MOD_POSSESS
Definition: SpellAuraDefines.h:65

References RemoveAurasByType(), SPELL_AURA_AOE_CHARM, SPELL_AURA_MOD_CHARM, SPELL_AURA_MOD_POSSESS, and SPELL_AURA_MOD_POSSESS_PET.

Referenced by misc_commandscript::HandleUnPossessCommand(), RemoveAllControlled(), RemoveFromWorld(), and Creature::Update().

◆ RemoveCharmedBy()

void Unit::RemoveCharmedBy ( Unit charmer)
18456{
18457 if (!IsCharmed())
18458 return;
18459
18460 if (!charmer)
18461 charmer = GetCharmer();
18462 if (charmer != GetCharmer()) // one aura overrides another?
18463 {
18464 // LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: {} true charmer: {} false charmer: {}",
18465 // GetGUID().ToString(), GetCharmerGUID().ToString(), charmer->GetGUID().ToString());
18466 // ABORT();
18467 return;
18468 }
18469
18470 CharmType type;
18472 type = CHARM_TYPE_POSSESS;
18473 else if (charmer && charmer->IsOnVehicle(this))
18474 type = CHARM_TYPE_VEHICLE;
18475 else
18476 type = CHARM_TYPE_CHARM;
18477
18478 if (_oldFactionId)
18479 {
18481 _oldFactionId = 0;
18482 }
18483 else
18485
18486 CastStop();
18487 AttackStop();
18488
18489 // xinef: update speed after charming
18490 UpdateSpeed(MOVE_RUN, false);
18491
18492 // xinef: do not break any controlled motion slot
18493 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
18494 {
18495 StopMoving();
18497 }
18498 // xinef: if we have any controlled movement, clear active and idle only
18499 else
18501
18503
18504 // xinef: remove stunned flag if owner was mounted
18507
18508 // If charmer still exists
18509 if (!charmer)
18510 return;
18511
18512 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18514
18515 charmer->SetCharm(this, false);
18516
18518
18519 Player* playerCharmer = charmer->ToPlayer();
18520 if (playerCharmer)
18521 {
18522 switch (type)
18523 {
18524 case CHARM_TYPE_VEHICLE:
18525 playerCharmer->SetClientControl(this, false);
18526 playerCharmer->SetClientControl(charmer, true); // verified
18529 break;
18530 case CHARM_TYPE_POSSESS:
18531 playerCharmer->SetClientControl(this, false);
18532 playerCharmer->SetClientControl(charmer, true); // verified
18537 break;
18538 case CHARM_TYPE_CHARM:
18540 {
18542 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18543 {
18545 if (GetCharmInfo())
18546 GetCharmInfo()->SetPetNumber(0, true);
18547 else
18548 LOG_ERROR("entities.unit", "Aura::HandleModCharm: target={} has a charm aura but no charm info!", GetGUID().ToString());
18549 }
18550 }
18551 break;
18552 default:
18553 break;
18554 }
18555 }
18556
18557 if (Player* player = ToPlayer())
18558 {
18559 sScriptMgr->AnticheatSetUnderACKmount(player);
18560 }
18561
18562 // xinef: restore threat
18563 for (CharmThreatMap::const_iterator itr = _charmThreatInfo.begin(); itr != _charmThreatInfo.end(); ++itr)
18564 {
18565 if (Unit* target = ObjectAccessor::GetUnit(*this, itr->first))
18566 if (!IsFriendlyTo(target))
18567 AddThreat(target, itr->second);
18568 }
18569
18570 _charmThreatInfo.clear();
18571
18572 if (Creature* creature = ToCreature())
18573 {
18574 // Vehicle should not attack its passenger after he exists the seat
18575 if (type != CHARM_TYPE_VEHICLE && charmer->IsAlive() && !charmer->IsFriendlyTo(creature))
18576 if (Attack(charmer, true))
18577 GetMotionMaster()->MoveChase(charmer);
18578
18579 // Creature will restore its old AI on next update
18580 if (creature->AI())
18581 creature->AI()->OnCharmed(false);
18582
18583 // Xinef: Remove movement flag flying
18585 }
18586 else
18587 ToPlayer()->SetClientControl(this, true); // verified
18588
18589 // a guardian should always have charminfo
18590 if (playerCharmer && this != charmer->GetFirstControlled())
18591 playerCharmer->SendRemoveControlBar();
18592
18593 // xinef: Always delete charm info (restores react state)
18594 if (IsPlayer() || (GetTypeId() == TYPEID_UNIT && !ToCreature()->IsGuardian()))
18596}
CharmType
Definition: CharmInfo.h:43
@ CHARM_TYPE_CHARM
Definition: CharmInfo.h:44
@ CHARM_TYPE_POSSESS
Definition: CharmInfo.h:45
@ CHARM_TYPE_VEHICLE
Definition: CharmInfo.h:46
@ CLASS_CONTEXT_PET_CHARM
Definition: UnitDefines.h:216
@ UNIT_STATE_NO_ENVIRONMENT_UPD
Definition: UnitDefines.h:177
@ MOVE_RUN
Definition: UnitDefines.h:329
@ UNIT_FLAG_DISABLE_MOVE
Definition: UnitDefines.h:231
@ MOTION_SLOT_CONTROLLED
Definition: MotionMaster.h:63
@ MOTION_SLOT_ACTIVE
Definition: MotionMaster.h:62
@ NULL_MOTION_TYPE
Definition: MotionMaster.h:56
@ CREATURE_TYPE_DEMON
Definition: SharedDefines.h:2630
uint32 unit_class
Definition: CreatureData.h:216
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition: Object.cpp:750
void SendRemoveControlBar()
Definition: Player.cpp:9653
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition: Player.cpp:12802
void DeleteCharmInfo()
Definition: Unit.cpp:15733
void RestoreFaction()
Definition: Unit.cpp:18598
void SetCharm(Unit *target, bool apply)
Definition: Unit.cpp:10797
void StopAttackingInvalidTarget()
Definition: Unit.cpp:20106
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Definition: Unit.cpp:1144
bool Attack(Unit *victim, bool meleeAttack)
Definition: Unit.cpp:10207
CharmThreatMap _charmThreatInfo
Definition: Unit.h:1874
void RemoveUnitMovementFlag(uint32 f)
Definition: Unit.h:1615
void UpdateSpeed(UnitMoveType mtype, bool forced)
Definition: Unit.cpp:14165
void InitDefault()
Definition: MotionMaster.cpp:87
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition: MotionMaster.h:192
void MovementExpired(bool reset=true)
Definition: MotionMaster.h:178

References _charmThreatInfo, _oldFactionId, AddThreat(), ASSERT, Attack(), AttackStop(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, CLASS_CONTEXT_PET_CHARM, CLASS_WARLOCK, ClearUnitState(), CREATURE_TYPE_DEMON, DeleteCharmInfo(), GetCharmer(), GetCharmInfo(), Creature::GetCreatureTemplate(), GetFirstControlled(), Object::GetGUID(), GetMotionMaster(), Object::GetTypeId(), ObjectAccessor::GetUnit(), HasUnitState(), MotionMaster::InitDefault(), IsAlive(), IsCharmed(), IsClass(), IsFriendlyTo(), IsGuardian(), IsOnVehicle(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED, MOVE_RUN, MotionMaster::MoveChase(), MotionMaster::MovementExpired(), MotionMaster::MovementExpiredOnSlot(), MOVEMENTFLAG_FLYING, NULL_MOTION_TYPE, RemoveUnitFlag(), RemoveUnitMovementFlag(), RestoreFaction(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), sScriptMgr, StopAttackingInvalidTarget(), StopMoving(), Object::ToCreature(), Object::ToPlayer(), Position::ToString(), CreatureTemplate::type, TYPEID_UNIT, CreatureTemplate::unit_class, UNIT_FIELD_BYTES_0, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_FLAG_STUNNED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, UNIT_STATE_STUNNED, and UpdateSpeed().

Referenced by AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), npc_chesspiece::JustDied(), Puppet::RemoveFromWorld(), Vehicle::RemovePassenger(), and npc_chesspiece::sGossipSelect().

◆ RemoveComboPointHolder()

void Unit::RemoveComboPointHolder ( Unit unit)
inline
1642{ m_ComboPointHolders.erase(unit); }

References m_ComboPointHolders.

Referenced by AddComboPoints(), and ClearComboPoints().

◆ RemoveDynObject()

bool Unit::RemoveDynObject ( uint32  spellId)
6086{
6087 if (m_dynObj.empty())
6088 return false;
6089
6090 bool result = false;
6091 for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
6092 {
6093 DynamicObject* dynObj = *i;
6094 if (dynObj->GetSpellId() == spellId)
6095 {
6096 dynObj->Remove();
6097 i = m_dynObj.begin();
6098 result = true;
6099 }
6100 else
6101 ++i;
6102 }
6103
6104 return result;
6105}
void Remove()
Definition: DynamicObject.cpp:187

References DynamicObject::GetSpellId(), m_dynObj, and DynamicObject::Remove().

Referenced by Spell::cancel(), Spell::EffectAddFarsight(), and spell_item_shifting_naaru_silver::OnBaseRemove().

◆ RemoveEvadeAuras()

void Unit::RemoveEvadeAuras ( )
5382{
5383 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5384 {
5385 Aura const* aura = iter->second->GetBase();
5386 SpellInfo const* spellInfo = aura->GetSpellInfo();
5388 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5389 ++iter;
5390 else
5392 }
5393
5394 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5395 {
5396 Aura* aura = iter->second;
5397 SpellInfo const* spellInfo = aura->GetSpellInfo();
5399 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5400 ++iter;
5401 else
5403 }
5404}
@ SPELL_AURA_CLONE_CASTER
Definition: SpellAuraDefines.h:310
@ SPELL_ATTR0_CU_IGNORE_EVADE
Definition: SpellInfo.h:187
@ SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT
Definition: SharedDefines.h:444

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, GetOwnerGUID(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), Aura::IsPassive(), Object::IsPlayer(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CLONE_CASTER, and SPELL_AURA_CONTROL_VEHICLE.

Referenced by CreatureAI::_EnterEvadeMode(), and npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode().

◆ RemoveExtraUnitMovementFlag()

void Unit::RemoveExtraUnitMovementFlag ( uint16  f)
inline

◆ removeFollower()

void Unit::removeFollower ( FollowerReference )
inline
1602{ /* nothing to do yet */ }

Referenced by FollowerReference::targetObjectDestroyLink().

◆ RemoveFromWorld()

void Unit::RemoveFromWorld ( )
overridevirtual

Reimplemented from WorldObject.

15610{
15611 // cleanup
15612 ASSERT(GetGUID());
15613
15614 if (IsInWorld())
15615 {
15617 if (IsVehicle())
15619
15623
15626
15627 ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE
15630
15632
15633 if (GetCharmerGUID())
15634 {
15635 LOG_FATAL("entities.unit", "Unit {} has charmer guid when removed from world", GetEntry());
15636 ABORT();
15637 }
15638
15639 if (Unit* owner = GetOwner())
15640 {
15641 if (owner->m_Controlled.find(this) != owner->m_Controlled.end())
15642 {
15644 owner->SetMinion((Minion*)this, false);
15645 LOG_INFO("entities.unit", "Unit {} is in controlled list of {} when removed from world", GetEntry(), owner->GetEntry());
15646 //ABORT();
15647 }
15648 }
15649
15652 }
15653}
void RemoveFromWorld() override
Definition: Object.cpp:1182
void RemoveNotOwnSingleTargetAuras()
Definition: Unit.cpp:5089
void UnsummonAllTotems(bool onDeath=false)
Definition: Unit.cpp:11126
void RemoveAllDynObjects()
Definition: Unit.cpp:6107
void RemoveAreaAurasDueToLeaveWorld()
Definition: Unit.cpp:5230
void RemoveBindSightAuras()
Definition: Unit.cpp:11113
void RemoveAllControlled(bool onDeath=false)
Definition: Unit.cpp:11007

References ABORT, ASSERT, ExitVehicle(), GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwner(), HasUnitTypeMask(), Object::IsInWorld(), IsVehicle(), LOG_FATAL, LOG_INFO, m_duringRemoveFromWorld, RemoveAllControlled(), RemoveAllDynObjects(), RemoveAllGameObjects(), RemoveAreaAurasDueToLeaveWorld(), RemoveBindSightAuras(), RemoveCharmAuras(), WorldObject::RemoveFromWorld(), RemoveNotOwnSingleTargetAuras(), RemoveVehicleKit(), UNIT_MASK_GUARDIAN, UNIT_MASK_MINION, and UnsummonAllTotems().

Referenced by CleanupBeforeRemoveFromMap(), Creature::RemoveFromWorld(), Pet::RemoveFromWorld(), and Player::RemoveFromWorld().

◆ RemoveGameObject() [1/2]

void Unit::RemoveGameObject ( GameObject gameObj,
bool  del 
)
6142{
6143 if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
6144 return;
6145
6147
6148 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
6149 {
6150 if (m_ObjectSlot[i] == gameObj->GetGUID())
6151 {
6152 m_ObjectSlot[i].Clear();
6153 break;
6154 }
6155 }
6156
6157 // GO created by some spell
6158 if (uint32 spellid = gameObj->GetSpellId())
6159 {
6160 RemoveAurasDueToSpell(spellid);
6161
6162 if (IsPlayer())
6163 {
6164 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
6165 // Need activate spell use for owner
6166 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6167 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6168 ToPlayer()->SendCooldownEvent(createBySpell);
6169 }
6170 }
6171
6172 m_gameObj.remove(gameObj->GetGUID());
6173
6174 if (del)
6175 {
6176 gameObj->SetRespawnTime(0);
6177 gameObj->Delete();
6178 }
6179}
void Clear()
Definition: ObjectGuid.h:138
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition: Player.cpp:11061

References ObjectGuid::Clear(), GameObject::Delete(), ObjectGuid::Empty, Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, m_ObjectSlot, MAX_GAMEOBJECT_SLOT, RemoveAurasDueToSpell(), Player::SendCooldownEvent(), GameObject::SetOwnerGUID(), GameObject::SetRespawnTime(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::cancel(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), Spell::EffectSummonObject(), gobject_commandscript::HandleGameObjectDeleteCommand(), spell_warl_demonic_circle_summon::HandleRemove(), boss_kologarn::boss_kologarnAI::JustDied(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::JustDied(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), GameObject::Update(), and npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI().

◆ RemoveGameObject() [2/2]

void Unit::RemoveGameObject ( uint32  spellid,
bool  del 
)
6182{
6183 if (m_gameObj.empty())
6184 return;
6185
6186 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
6187 {
6188 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6189 {
6190 if (spellid > 0 && go->GetSpellId() != spellid)
6191 {
6192 ++itr;
6193 continue;
6194 }
6195
6196 go->SetOwnerGUID(ObjectGuid::Empty);
6197 if(del)
6198 {
6199 go->SetRespawnTime(0);
6200 go->Delete();
6201 }
6202 }
6203 m_gameObj.erase(itr++);
6204 }
6205}

References ObjectGuid::Empty, ObjectAccessor::GetGameObject(), and m_gameObj.

◆ removeHatedBy()

void Unit::removeHatedBy ( HostileReference )
inline
1490{ /* nothing to do yet */ }

Referenced by HostileReference::targetObjectDestroyLink().

◆ RemoveMovementImpairingAuras()

void Unit::RemoveMovementImpairingAuras ( bool  withRoot)
5179{
5180 if (withRoot)
5182
5183 // Snares
5184 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5185 {
5186 Aura const* aura = iter->second->GetBase();
5188 {
5189 RemoveAura(iter);
5190 continue;
5191 }
5192
5193 ++iter;
5194 }
5195}
bool HasEffectMechanic(Mechanics mechanic) const
Definition: SpellInfo.cpp:883

References Aura::GetSpellInfo(), SpellInfo::HasEffectMechanic(), m_appliedAuras, SpellInfo::Mechanic, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), and RemoveAurasWithMechanic().

Referenced by Spell::CheckCast(), Spell::EffectTriggerSpell(), HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), and spell_gen_remove_impairing_auras::HandleScriptEffect().

◆ RemoveNotOwnSingleTargetAuras()

void Unit::RemoveNotOwnSingleTargetAuras ( )
5090{
5091 // single target auras from other casters
5092 // Iterate m_ownedAuras - aura is marked as single target in Unit::AddAura (and pushed to m_ownedAuras).
5093 // m_appliedAuras will NOT contain the aura before first Unit::Update after adding it to m_ownedAuras.
5094 // Quickly removing such an aura will lead to it not being unregistered from caster's single cast auras container
5095 // leading to assertion failures if the aura was cast on a player that can
5096 // (and is changing map at the point where this function is called).
5097 // Such situation occurs when player is logging in inside an instance and fails the entry check for any reason.
5098 // The aura that was loaded from db (indirectly, via linked casts) gets removed before it has a chance
5099 // to register in m_appliedAuras
5100 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5101 {
5102 Aura const* aura = iter->second;
5103
5104 if (aura->GetCasterGUID() != GetGUID() && aura->IsSingleTarget())
5105 RemoveOwnedAura(iter);
5106 else
5107 ++iter;
5108 }
5109
5110 // single target auras at other targets
5111 AuraList& scAuras = GetSingleCastAuras();
5112 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
5113 {
5114 Aura* aura = *iter;
5115 if (aura->GetUnitOwner() != this)
5116 {
5117 aura->Remove();
5118 iter = scAuras.begin();
5119 }
5120 else
5121 ++iter;
5122 }
5123}

References Aura::GetCasterGUID(), Object::GetGUID(), GetSingleCastAuras(), Aura::GetUnitOwner(), Aura::IsSingleTarget(), m_ownedAuras, Aura::Remove(), and RemoveOwnedAura().

Referenced by RemoveFromWorld().

◆ RemoveNpcFlag()

void Unit::RemoveNpcFlag ( NPCFlags  flags)
inline
992{ RemoveFlag(UNIT_NPC_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_vaelastrasz::boss_vaelAI::BeginSpeech(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_fos_leader::npc_fos_leaderAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_akama_illidan::npc_akama_illidanAI::DoAction(), spell_q12096_q12092_dummy::HandleDummy(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), npc_precious::npc_preciousAI::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), npc_fos_leader_second::npc_fos_leader_secondAI::npc_fos_leader_secondAI(), npc_pos_leader_second::npc_pos_leader_secondAI::npc_pos_leader_secondAI(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_announcer_toc10::OnGossipHello(), npc_hyjal_jaina::OnGossipSelect(), npc_hyjal_thrall::OnGossipSelect(), boss_doomrel::OnGossipSelect(), boss_majordomo::OnGossipSelect(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_ulduar_keeper::OnGossipSelect(), npc_announcer_toc5::OnGossipSelect(), npc_announcer_toc10::OnGossipSelect(), npc_hor_leader::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_hor_leader_second::OnGossipSelect(), npc_battle_at_valhalas::OnQuestAccept(), npc_riggle_bassbait::OnQuestReward(), NPCStaveQuestAI::PrepareForEncounter(), RemoveVehicleKit(), boss_majordomo::boss_majordomoAI::Reset(), npc_arthas::npc_arthasAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), npc_xerestrasza::npc_xerestraszaAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_lake_frog::npc_lake_frogAI::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_magister_aledis::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::sGossipSelect(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::sGossipSelect(), boss_apothecary_hummel::boss_apothecary_hummelAI::sGossipSelect(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::npc_harrison_jonesAI::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_general_andorov::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_chesspiece::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), dragonmaw_race_npc::sQuestAccept(), npc_magister_aledis::StartFight(), npc_cork_gizelton::npc_cork_gizeltonAI::SummonHelpers(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), and npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI().

◆ RemoveOwnedAura() [1/3]

void Unit::RemoveOwnedAura ( Aura aura,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4694{
4695 if (aura->IsRemoved())
4696 return;
4697
4698 ASSERT(aura->GetOwner() == this);
4699
4700 uint32 spellId = aura->GetId();
4701 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4702
4703 for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
4704 {
4705 if (itr->second == aura)
4706 {
4707 RemoveOwnedAura(itr, removeMode);
4708 return;
4709 }
4710 }
4711
4712 ABORT();
4713}

References ABORT, ASSERT, Aura::GetId(), Aura::GetOwner(), Aura::IsRemoved(), m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAura() [2/3]

void Unit::RemoveOwnedAura ( AuraMap::iterator &  i,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)

◆ RemoveOwnedAura() [3/3]

void Unit::RemoveOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4682{
4683 for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);)
4684 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID))
4685 {
4686 RemoveOwnedAura(itr, removeMode);
4687 itr = m_ownedAuras.lower_bound(spellId);
4688 }
4689 else
4690 ++itr;
4691}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [1/2]

void Unit::RemoveOwnedAuras ( std::function< bool(Aura const *)> const &  check)
4813{
4814 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
4815 {
4816 if (check(iter->second))
4817 {
4818 RemoveOwnedAura(iter);
4819 continue;
4820 }
4821 ++iter;
4822 }
4823}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [2/2]

void Unit::RemoveOwnedAuras ( uint32  spellId,
std::function< bool(Aura const *)> const &  check 
)
4839{
4840 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
4841 {
4842 if (check(iter->second))
4843 {
4844 RemoveOwnedAura(iter);
4845 continue;
4846 }
4847 ++iter;
4848 }
4849}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemovePetAura()

void Unit::RemovePetAura ( PetAura const *  petSpell)
17213{
17214 if (GetTypeId() != TYPEID_PLAYER)
17215 return;
17216
17217 m_petAuras.erase(petSpell);
17218 if (Pet* pet = ToPlayer()->GetPet())
17219 pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
17220 if (Unit* charm = GetCharm())
17221 charm->RemoveAurasDueToSpell(petSpell->GetAura(charm->GetEntry()));
17222}

References PetAura::GetAura(), GetCharm(), Object::GetTypeId(), m_petAuras, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by Player::_removeTalentAurasAndSpells(), Pet::CastPetAuras(), AuraEffect::HandleAuraDummy(), and Player::removeSpell().

◆ RemovePlayerFromVision()

void Unit::RemovePlayerFromVision ( Player player)
11103{
11104 m_sharedVision.remove(player);
11105 player->m_isInSharedVisionOf.erase(this);
11106 if (m_sharedVision.empty())
11107 {
11108 setActive(false);
11109 SetWorldObject(false);
11110 }
11111}

References Player::m_isInSharedVisionOf, m_sharedVision, WorldObject::setActive(), and WorldObject::SetWorldObject().

Referenced by Player::SetViewpoint(), and Player::~Player().

◆ RemovePointedBy()

void Unit::RemovePointedBy ( SafeUnitPointer sup)
inline

◆ RemoveStandFlags()

void Unit::RemoveStandFlags ( uint8  flags)
inline
@ UNIT_BYTES_1_OFFSET_VIS_FLAG
Definition: UnitDefines.h:25
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition: Object.cpp:930

References Object::RemoveByteFlag(), UNIT_BYTES_1_OFFSET_VIS_FLAG, and UNIT_FIELD_BYTES_1.

Referenced by AuraEffect::HandleModStealth(), Player::InitStatsForLevel(), and npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI().

◆ RemoveUnitFlag()

void Unit::RemoveUnitFlag ( UnitFlags  flags)
inline
826{ RemoveFlag(UNIT_FIELD_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_FIELD_FLAGS.

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), Player::BuildPlayerRepop(), boss_thekal::CheckPhaseTransition(), Player::CleanupAfterTaxiFlight(), ClearInCombat(), ClearInPetCombat(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), Dismount(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_thekal::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_the_lurker_below::DoAction(), npc_frozen_core::DoAction(), boss_broggok::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_cthun::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DoAction(), boss_essence_of_desire::boss_essence_of_desireAI::DoAction(), boss_essence_of_anger::boss_essence_of_angerAI::DoAction(), boss_kelidan_the_breaker::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), HomeMovementGenerator< Creature >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), WorldSession::DoLootRelease(), Spell::EffectResurrectPet(), Spell::EffectSkinning(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_bronjahm::boss_bronjahmAI::EnterEvadeMode(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), boss_kelthuzad::boss_kelthuzadAI::EnterEvadeMode(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_ymiron::boss_ymironAI::EnterEvadeMode(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), SACActivateEvent::Execute(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::FeignDeath(), TimedFleeingMovementGenerator::Finalize(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_feign_death_all_flags::HandleEffectRemove(), spell_gen_feign_death_no_dyn_flag::HandleEffectRemove(), spell_gen_feign_death_no_prevent_emotes::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLogoutCancelOpcode(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), WorldSession::HandlePlayerLoginToCharInWorld(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_jarien::IsSummonedBy(), boss_sothos::IsSummonedBy(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), boss_volazj::JustDied(), boss_ichoron::boss_ichoronAI::JustDied(), boss_illidan_stormrage::boss_illidan_stormrageAI::JustDied(), boss_taerar::boss_taerarAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_ymiron::boss_ymironAI::JustEngagedWith(), boss_hazzarah::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_amanitar_mushrooms::npc_amanitar_mushrooms(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), npc_death_knight_initiate::OnGossipSelect(), npc_bessy::OnQuestAccept(), spell_halion_twilight_phasing_aura::OnRemove(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), RemoveCharmedBy(), Vehicle::RemovePassenger(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), boss_lord_valthalak::boss_lord_valthalakAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_crone::Reset(), boss_julianne::Reset(), npc_mograine::npc_mograineAI::Reset(), boss_felmyst::boss_felmystAI::Reset(), boss_kalecgos::boss_kalecgosAI::Reset(), boss_muru::boss_muruAI::Reset(), boss_eye_of_cthun::Reset(), boss_volazj::Reset(), boss_anub_arak::boss_anub_arakAI::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_kelthuzad::boss_kelthuzadAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_crystalline_frayer::npc_crystalline_frayerAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_mimiron::boss_mimironAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::Reset(), boss_svala::boss_svalaAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), boss_ichoron::boss_ichoronAI::Reset(), npc_wounded_skirmisher::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_leotheras_the_blind::Reset(), npc_shattered_hand_scout::Reset(), emerald_dragonAI::Reset(), npc_doctor::npc_doctorAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_the_lurker_below::SchedulerPhaseTwo(), SetCharm(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SetData(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SetData(), Pet::setDeathState(), SetImmuneToNPC(), SetImmuneToPC(), Player::SetIsSpectator(), SetStunned(), SetSwim(), Battlefield::ShowNpc(), boss_zuljin::boss_zuljinAI::SpawnAdds(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SpellHit(), npc_ulduar_vx001::npc_ulduar_vx001AI::SpellHit(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SpellHit(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), boss_lord_valthalak::boss_lord_valthalakAI::StartFighting(), boss_noth::boss_nothAI::StartGroundPhase(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_mograine::npc_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_crystalline_frayer::npc_crystalline_frayerAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached(), and npc_general_andorov::WaypointReached().

◆ RemoveUnitFlag2()

◆ RemoveUnitMovementFlag()

◆ RemoveVehicleKit()

void Unit::RemoveVehicleKit ( )
18631{
18632 if (!m_vehicleKit)
18633 return;
18634
18636 delete m_vehicleKit;
18637
18638 m_vehicleKit = nullptr;
18639
18640 m_updateFlag &= ~UPDATEFLAG_VEHICLE;
18641 m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
18643}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition: UnitDefines.h:318
@ UNIT_NPC_FLAG_PLAYER_VEHICLE
Definition: UnitDefines.h:319
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:992

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, RemoveNpcFlag(), Vehicle::Uninstall(), UNIT_NPC_FLAG_PLAYER_VEHICLE, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Dismount(), AuraEffect::HandleAuraSetVehicle(), npc_gunship::npc_gunshipAI::JustDied(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), and RemoveFromWorld().

◆ RemoveVisibleAura()

void Unit::RemoveVisibleAura ( uint8  slot)
inline
1502{ m_visibleAuras.erase(slot); UpdateAuraForGroup(slot);}
void UpdateAuraForGroup(uint8 slot)
Definition: Unit.cpp:17083

References m_visibleAuras, and UpdateAuraForGroup().

Referenced by AuraApplication::_Remove().

◆ ReplaceAllDynamicFlags()

◆ ReplaceAllNpcFlags()

void Unit::ReplaceAllNpcFlags ( NPCFlags  flags)
inline

References SetUInt32Value(), and UNIT_NPC_FLAGS.

Referenced by Pet::CreateBaseAtTamed(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), Spell::EffectSummonType(), SmartAI::EndPath(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFlagCommand(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_akama_illidan::npc_akama_illidanAI::JustSummoned(), Pet::LoadPetFromDB(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_shandy_dalaran::OnGossipSelect(), go_crystalline_tear::OnQuestAccept(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), boss_doomrel::boss_doomrelAI::Reset(), npc_eris_hevenfire::npc_eris_hevenfireAI::Reset(), npc_taretha::npc_tarethaAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Creature::setDeathState(), npc_eris_hevenfire::npc_eris_hevenfireAI::SetGUID(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_akama_illidan::npc_akama_illidanAI::sGossipSelect(), npc_escortAI::Start(), FollowerAI::StartFollow(), SmartAI::StartPath(), Player::SummonPet(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), Creature::UpdateEntry(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), npc_captain_saeed::npc_captain_saeedAI::WaypointReached(), and npc_akama_illidan::npc_akama_illidanAI::WaypointReached().

◆ ReplaceAllUnitFlags()

◆ ReplaceAllUnitFlags2()

void Unit::ReplaceAllUnitFlags2 ( UnitFlags2  flags)
inline

◆ resetAttackTimer()

◆ ResetRedirectThreat()

◆ RestoreDisplayId()

void Unit::RestoreDisplayId ( )
16690{
16691 AuraEffect* handledAura = nullptr;
16692 AuraEffect* handledAuraForced = nullptr;
16693 // try to receive model from transform auras
16695 if (!transforms.empty())
16696 {
16697 // iterate over already applied transform auras - from newest to oldest
16698 for (auto i = transforms.rbegin(); i != transforms.rend(); ++i)
16699 {
16700 if (AuraApplication const* aurApp = (*i)->GetBase()->GetApplicationOfTarget(GetGUID()))
16701 {
16702 if (!handledAura)
16703 handledAura = (*i);
16704 // xinef: prefer negative/forced auras
16705 if ((*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) || !aurApp->IsPositive())
16706 {
16707 handledAuraForced = (*i);
16708 break;
16709 }
16710 }
16711 }
16712 }
16713
16714 // Xinef: include clone auras (eg mirror images)
16715 if (!handledAuraForced && !handledAura)
16716 {
16718 if (!cloneAuras.empty())
16719 for (Unit::AuraEffectList::const_iterator i = cloneAuras.begin(); i != cloneAuras.end(); ++i)
16720 handledAura = *i;
16721 }
16722
16724
16725 // xinef: order of execution is important!
16726 // first forced transform auras, then shapeshifts, then normal transform
16727 // transform aura was found
16728 if (handledAuraForced)
16729 {
16730 handledAuraForced->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16731 return;
16732 }
16733 else if (!shapeshiftAura.empty()) // we've found shapeshift
16734 {
16735 // only one such aura possible at a time
16736 if (uint32 modelId = GetModelForForm(GetShapeshiftForm(), shapeshiftAura.front()->GetId()))
16737 {
16738 SetDisplayId(modelId);
16739 return;
16740 }
16741 }
16742 else if (handledAura)
16743 {
16744 handledAura->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16745 return;
16746 }
16747
16748 // no auras found - set modelid to default
16750}
@ SPELL_AURA_MOD_SHAPESHIFT
Definition: SpellAuraDefines.h:99
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition: SpellAuraDefines.h:43
uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId) const
Definition: Unit.cpp:19103
void HandleEffect(AuraApplication *aurApp, uint8 mode, bool apply)
Definition: SpellAuraEffects.cpp:741

References AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraApplication::GetBase(), Object::GetGUID(), GetModelForForm(), GetNativeDisplayId(), GetShapeshiftForm(), AuraEffect::HandleEffect(), SetDisplayId(), SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_CLONE_CASTER, SPELL_AURA_MOD_SHAPESHIFT, and SPELL_AURA_TRANSFORM.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), spell_gen_aura_service_uniform::OnRemove(), and Player::SetIsSpectator().

◆ RestoreFaction()

void Unit::RestoreFaction ( )
18599{
18600 if (IsPlayer())
18602 else
18603 {
18605 {
18606 if (Unit* owner = GetOwner())
18607 {
18608 SetFaction(owner->GetFaction());
18609 return;
18610 }
18611 }
18612
18613 if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature
18614 SetFaction(cinfo->faction);
18615 }
18616}
void SetFactionForRace(uint8 race)
Definition: Player.cpp:5805

References GetOwner(), getRace(), HasUnitTypeMask(), Object::IsPlayer(), SetFaction(), Player::SetFactionForRace(), Object::ToCreature(), Object::ToPlayer(), and UNIT_MASK_MINION.

Referenced by npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), boss_thekal::DoAction(), AuraEffect::HandleAuraModFaction(), npc_commandscript::HandleNpcSetOriginalFaction(), npc_enslaved_netherwing_drake::JustDied(), npc_escortAI::JustRespawned(), SmartAI::JustRespawned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), RemoveCharmedBy(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_crusade_persuaded::npc_crusade_persuadedAI::Reset(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::Reset(), npc_calvin_montague::npc_calvin_montagueAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_ahnqiraji_critter::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_magister_aledis::Reset(), npc_captain_saeed::npc_captain_saeedAI::Reset(), npc_bessy::npc_bessyAI::Reset(), and npc_enslaved_netherwing_drake::Reset().

◆ ResumeMovement()

void Unit::ResumeMovement ( uint32  timer = 0,
uint8  slot = 0 
)
16595{
16596 if (slot >= MAX_MOTION_SLOT)
16597 return;
16598
16599 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16600 movementGenerator->Resume(timer);
16601}

References GetMotionMaster(), and MAX_MOTION_SLOT.

Referenced by boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight().

◆ RewardRage()

void Unit::RewardRage ( uint32  damage,
uint32  weaponSpeedHitFactor,
bool  attacker 
)
20042{
20043 float addRage;
20044
20045 float rageconversion = ((0.0091107836f * GetLevel() * GetLevel()) + 3.225598133f * GetLevel()) + 4.2652911f;
20046
20047 // Unknown if correct, but lineary adjust rage conversion above level 70
20048 if (GetLevel() > 70)
20049 rageconversion += 13.27f * (GetLevel() - 70);
20050
20051 if (attacker)
20052 {
20053 addRage = (damage / rageconversion * 7.5f + weaponSpeedHitFactor) / 2;
20054
20055 // talent who gave more rage on attack
20057 }
20058 else
20059 {
20060 addRage = damage / rageconversion * 2.5f;
20061
20062 // Berserker Rage effect
20063 if (HasAura(18499))
20064 addRage *= 3.0f;
20065 }
20066
20067 addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
20068
20069 ModifyPower(POWER_RAGE, uint32(addRage * 10));
20070}
@ SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT
Definition: SpellAuraDefines.h:276
@ RATE_POWER_RAGE_INCOME
Definition: IWorld.h:433

References AddPct(), GetLevel(), GetTotalAuraModifier(), HasAura(), ModifyPower(), POWER_RAGE, RATE_POWER_RAGE_INCOME, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT, and sWorld.

Referenced by DealDamage().

◆ RollMeleeOutcomeAgainst() [1/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType 
) const
2746{
2747 // This is only wrapper
2748
2749 // Miss chance based on melee
2750 //float miss_chance = MeleeMissChanceCalc(victim, attType);
2751 float miss_chance = MeleeSpellMissChance(victim, attType, int32(GetWeaponSkillValue(attType, victim)) - int32(victim->GetMaxSkillValueForLevel(this)), 0);
2752
2753 // Critical hit chance
2754 float crit_chance = GetUnitCriticalChance(attType, victim);
2755 if( crit_chance < 0 )
2756 crit_chance = 0;
2757
2758 float dodge_chance = victim->GetUnitDodgeChance();
2759 float block_chance = victim->GetUnitBlockChance();
2760 float parry_chance = victim->GetUnitParryChance();
2761
2762 // Useful if want to specify crit & miss chances for melee, else it could be removed
2763 //LOG_DEBUG("entities.unit", "MELEE OUTCOME: miss {} crit {} dodge {} parry {} block {}", miss_chance, crit_chance, dodge_chance, parry_chance, block_chance);
2764
2765 return RollMeleeOutcomeAgainst(victim, attType, int32(crit_chance * 100), int32(miss_chance * 100), int32(dodge_chance * 100), int32(parry_chance * 100), int32(block_chance * 100));
2766}
float GetUnitCriticalChance(WeaponAttackType attackType, Unit const *victim) const
Definition: Unit.cpp:3688

References GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), MeleeSpellMissChance(), and RollMeleeOutcomeAgainst().

Referenced by CalculateMeleeDamage(), and RollMeleeOutcomeAgainst().

◆ RollMeleeOutcomeAgainst() [2/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType,
int32  crit_chance,
int32  miss_chance,
int32  dodge_chance,
int32  parry_chance,
int32  block_chance 
) const
2769{
2770 if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks())
2771 {
2772 return MELEE_HIT_EVADE;
2773 }
2774
2775 int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
2776 int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
2777
2778 int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
2779 int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
2780
2781 sScriptMgr->OnBeforeRollMeleeOutcomeAgainst(this, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance);
2782
2783 // bonus from skills is 0.04%
2784 int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
2785 int32 sum = 0, tmp = 0;
2786 int32 roll = urand (0, 10000);
2787
2788 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: skill bonus of {} for attacker", skillBonus);
2789 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: rolled {}, miss {}, dodge {}, parry {}, block {}, crit {}",
2790 // roll, miss_chance, dodge_chance, parry_chance, block_chance, crit_chance);
2791
2792 tmp = miss_chance;
2793
2794 if (tmp > 0 && roll < (sum += tmp))
2795 {
2796 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: MISS");
2797 return MELEE_HIT_MISS;
2798 }
2799
2800 // Dodge chance
2801
2802 // only players can't dodge if attacker is behind
2803 if (victim->IsPlayer() && !victim->HasInArc(M_PI, this) && !victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION))
2804 {
2805 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind and victim was a player.");
2806 }
2807 // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag
2808 else if (victim->IsPlayer() || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_DODGE))
2809 {
2810 // Reduce dodge chance by attacker expertise rating
2811 if (IsPlayer())
2812 dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2813 else
2814 dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2815
2816 // Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
2818 dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
2819
2820 tmp = dodge_chance;
2821
2822 // xinef: if casting or stunned - cant dodge
2823 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2824 tmp = 0;
2825
2826 if ((tmp > 0) // check if unit _can_ dodge
2827 && ((tmp -= skillBonus) > 0)
2828 && roll < (sum += tmp))
2829 {
2830 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: DODGE <{}, {})", sum - tmp, sum);
2831 return MELEE_HIT_DODGE;
2832 }
2833 }
2834
2835 // parry & block chances
2836
2837 // check if attack comes from behind, nobody can parry or block if attacker is behind
2838 if (!victim->HasInArc(M_PI, this) && !victim->HasAuraType(SPELL_AURA_IGNORE_HIT_DIRECTION))
2839 {
2840 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind.");
2841 }
2842 else
2843 {
2844 // Reduce parry chance by attacker expertise rating
2845 if (IsPlayer())
2846 parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2847 else
2848 parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2849
2850 if (victim->IsPlayer() || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_PARRY))
2851 {
2852 tmp = parry_chance;
2853
2854 // xinef: cant parry while casting or while stunned
2855 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2856 tmp = 0;
2857
2858 if (tmp > 0 // check if unit _can_ parry
2859 && (tmp -= skillBonus) > 0
2860 && roll < (sum += tmp))
2861 {
2862 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: PARRY <{}, {})", sum - tmp, sum);
2863 return MELEE_HIT_PARRY;
2864 }
2865 }
2866
2867 if (victim->IsPlayer() || !(victim->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_BLOCK))
2868 {
2869 tmp = block_chance;
2870
2871 // xinef: cant block while casting or while stunned
2872 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2873 tmp = 0;
2874
2875 if (tmp > 0 // check if unit _can_ block
2876 && (tmp -= skillBonus) > 0
2877 && roll < (sum += tmp))
2878 {
2879 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: BLOCK <{}, {})", sum - tmp, sum);
2880 return MELEE_HIT_BLOCK;
2881 }
2882 }
2883 }
2884
2885 // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
2886 if (attType != RANGED_ATTACK &&
2887 (IsPlayer() || IsPet()) &&
2888 victim->GetTypeId() != TYPEID_PLAYER && !victim->IsPet() &&
2889 GetLevel() < victim->getLevelForTarget(this))
2890 {
2891 // cap possible value (with bonuses > max skill)
2892 int32 skill = attackerWeaponSkill;
2893 int32 maxskill = attackerMaxSkillValueForLevel;
2894 skill = (skill > maxskill) ? maxskill : skill;
2895
2896 tmp = (10 + (victimDefenseSkill - skill)) * 100;
2897 tmp = tmp > 4000 ? 4000 : tmp;
2898 if (roll < (sum += tmp))
2899 {
2900 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: GLANCING <{}, {})", sum - 4000, sum);
2901 return MELEE_HIT_GLANCING;
2902 }
2903 }
2904
2905 // mobs can score crushing blows if they're 4 or more levels above victim
2906 if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 &&
2907 // can be from by creature (if can) or from controlled player that considered as creature
2909 !(GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS))
2910 {
2911 // when their weapon skill is 15 or more above victim's defense skill
2912 tmp = victimDefenseSkill;
2913 int32 tmpmax = victimMaxSkillValueForLevel;
2914 // having defense above your maximum (from items, talents etc.) has no effect
2915 tmp = tmp > tmpmax ? tmpmax : tmp;
2916 // tmp = mob's level * 5 - player's current defense skill
2917 tmp = attackerMaxSkillValueForLevel - tmp;
2918 if (tmp >= 15)
2919 {
2920 // add 2% chance per lacking skill point, min. is 15%
2921 tmp = tmp * 200 - 1500;
2922 if (roll < (sum += tmp))
2923 {
2924 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRUSHING <{}, {})", sum - tmp, sum);
2925 return MELEE_HIT_CRUSHING;
2926 }
2927 }
2928 }
2929
2930 // Critical chance
2931 tmp = crit_chance;
2932
2933 if (tmp > 0 && roll < (sum += tmp))
2934 {
2935 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum);
2936 if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_CRIT))
2937 {
2938 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)");
2939 }
2940 else
2941 return MELEE_HIT_CRIT;
2942 }
2943
2944 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: NORMAL");
2945 return MELEE_HIT_NORMAL;
2946}
@ CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS
Definition: CreatureData.h:51
@ CREATURE_FLAG_EXTRA_NO_CRIT
Definition: CreatureData.h:63

References CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_CRIT, CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, CreatureTemplate::flags_extra, Creature::GetCreatureTemplate(), GetDefenseSkillValue(), GetLevel(), getLevelForTarget(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), Object::GetTypeId(), GetWeaponSkillValue(), HasAuraType(), Position::HasInArc(), HasUnitState(), IsControlledByPlayer(), Creature::IsEvadingAttacks(), IsNonMeleeSpellCast(), IsPet(), Object::IsPlayer(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, RANGED_ATTACK, SPELL_AURA_IGNORE_HIT_DIRECTION, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_STATE_CONTROLLED, urand(), and VICTIMSTATE_DODGE.

◆ Say() [1/2]

◆ Say() [2/2]

void Unit::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21061{
21062 Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
21063}

References CHAT_MSG_MONSTER_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ SelectNearbyNoTotemTarget()

Unit * Unit::SelectNearbyNoTotemTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
16934{
16935 std::list<Unit*> targets;
16936 Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, this, dist);
16938 Cell::VisitAllObjects(this, searcher, dist);
16939
16940 // remove current target
16941 if (GetVictim())
16942 targets.remove(GetVictim());
16943
16944 if (exclude)
16945 targets.remove(exclude);
16946
16947 // remove not LoS targets
16948 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
16949 {
16950 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
16951 {
16952 std::list<Unit*>::iterator tIter2 = tIter;
16953 ++tIter;
16954 targets.erase(tIter2);
16955 }
16956 else
16957 ++tIter;
16958 }
16959
16960 // no appropriate targets
16961 if (targets.empty())
16962 return nullptr;
16963
16964 // select random
16966}
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:133
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition: Unit.cpp:13786
Definition: GridNotifiers.h:423

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitAllObjects().

Referenced by spell_rog_blade_flurry::CheckProc(), and spell_warr_sweeping_strikes::CheckProc().

◆ SelectNearbyTarget()

Unit * Unit::SelectNearbyTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
16899{
16900 std::list<Unit*> targets;
16901 Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
16903 Cell::VisitAllObjects(this, searcher, dist);
16904
16905 // remove current target
16906 if (GetVictim())
16907 targets.remove(GetVictim());
16908
16909 if (exclude)
16910 targets.remove(exclude);
16911
16912 // remove not LoS targets
16913 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
16914 {
16915 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
16916 {
16917 std::list<Unit*>::iterator tIter2 = tIter;
16918 ++tIter;
16919 targets.erase(tIter2);
16920 }
16921 else
16922 ++tIter;
16923 }
16924
16925 // no appropriate targets
16926 if (targets.empty())
16927 return nullptr;
16928
16929 // select random
16931}
Definition: GridNotifiers.h:861

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitAllObjects().

Referenced by npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_curator::JustSummoned(), npc_hodirs_fury::npc_hodirs_furyAI::UpdateAI(), npc_storm_beacon_spawn::npc_storm_beacon_spawnAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), Player::UpdateCharmedAI(), and boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI().

◆ SendAttackStateUpdate() [1/2]

void Unit::SendAttackStateUpdate ( CalcDamageInfo damageInfo)

Probably used for debugging purposes, as it is not known to appear on retail servers

6424{
6425 LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
6426
6427 uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { };
6428 uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { };
6429 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6430 {
6431 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6432 tmpDamage[i] = damageInfo->damages[i].damage;
6433 tmpAbsorb[i] = damageInfo->damages[i].absorb;
6434 if (damageInfo->target->IsPlayer() && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6435 {
6436 tmpAbsorb[i] = tmpDamage[i];
6437 tmpDamage[i] = 0;
6438 }
6439 }
6440
6441 uint32 count = 1;
6442 if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist)
6443 {
6444 ++count;
6445 }
6446
6447 std::size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12;
6448 WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
6449 data << uint32(damageInfo->HitInfo);
6450 data << damageInfo->attacker->GetPackGUID();
6451 data << damageInfo->target->GetPackGUID();
6452 data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage
6453 int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth();
6454 data << uint32(overkill < 0 ? 0 : overkill); // Overkill
6455 data << uint8(count); // Sub damage count
6456
6457 for (uint32 i = 0; i < count; ++i)
6458 {
6459 data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage
6460 data << float(tmpDamage[i]); // sub damage
6461 data << uint32(tmpDamage[i]); // Sub Damage
6462 }
6463
6465 {
6466 for (uint32 i = 0; i < count; ++i)
6467 {
6468 data << uint32(tmpAbsorb[i]); // Absorb
6469 }
6470 }
6471
6473 {
6474 for (uint32 i = 0; i < count; ++i)
6475 {
6476 data << uint32(damageInfo->damages[i].resist); // Resist
6477 }
6478 }
6479
6480 data << uint8(damageInfo->TargetState);
6481 data << uint32(0); // Unknown attackerstate
6482 data << uint32(0); // Melee spellid
6483
6484 if (damageInfo->HitInfo & HITINFO_BLOCK)
6485 data << uint32(damageInfo->blocked_amount);
6486
6487 if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
6488 data << uint32(0);
6489
6491 if (damageInfo->HitInfo & HITINFO_UNK1)
6492 {
6493 data << uint32(0);
6494 data << float(0);
6495 data << float(0);
6496 data << float(0);
6497 data << float(0);
6498 data << float(0);
6499 data << float(0);
6500 data << float(0);
6501 data << float(0);
6502 data << float(0); // Found in a loop with 1 iteration
6503 data << float(0); // ditto ^
6504 data << uint32(0);
6505 }
6506
6507 SendMessageToSet(&data, true);
6508}
@ HITINFO_RAGE_GAIN
Definition: Unit.h:120
@ HITINFO_UNK1
Definition: Unit.h:97
@ SMSG_ATTACKERSTATEUPDATE
Definition: Opcodes.h:360

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CHEAT_GOD, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), CalcDamageInfo::HitInfo, HITINFO_BLOCK, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_RAGE_GAIN, HITINFO_UNK1, Object::IsPlayer(), LOG_DEBUG, MAX_ITEM_PROTO_DAMAGES, CalcDamageInfo::resist, WorldObject::SendMessageToSet(), SMSG_ATTACKERSTATEUPDATE, CalcDamageInfo::target, CalcDamageInfo::TargetState, and Object::ToPlayer().

Referenced by AttackerStateUpdate(), misc_commandscript::HandleDamageCommand(), spell_dk_dancing_rune_weapon::HandleProc(), and SendAttackStateUpdate().

◆ SendAttackStateUpdate() [2/2]

void Unit::SendAttackStateUpdate ( uint32  HitInfo,
Unit target,
uint8  SwingType,
SpellSchoolMask  damageSchoolMask,
uint32  Damage,
uint32  AbsorbDamage,
uint32  Resist,
VictimState  TargetState,
uint32  BlockedAmount 
)
6511{
6512 CalcDamageInfo dmgInfo;
6513 dmgInfo.HitInfo = HitInfo;
6514 dmgInfo.attacker = this;
6515 dmgInfo.target = target;
6516
6517 dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount;
6518 dmgInfo.damages[0].damageSchoolMask = damageSchoolMask;
6519 dmgInfo.damages[0].absorb = AbsorbDamage;
6520 dmgInfo.damages[0].resist = Resist;
6521
6522 dmgInfo.damages[1].damage = 0;
6523 dmgInfo.damages[1].damageSchoolMask = 0;
6524 dmgInfo.damages[1].absorb = 0;
6525 dmgInfo.damages[1].resist = 0;
6526
6527 dmgInfo.TargetState = TargetState;
6528 dmgInfo.blocked_amount = BlockedAmount;
6529 SendAttackStateUpdate(&dmgInfo);
6530}
HitInfo
Definition: Unit.h:95

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, CalcDamageInfo::HitInfo, CalcDamageInfo::resist, SendAttackStateUpdate(), CalcDamageInfo::target, and CalcDamageInfo::TargetState.

◆ SendChangeCurrentVictimOpcode()

void Unit::SendChangeCurrentVictimOpcode ( HostileReference pHostileReference)
20004{
20005 if (!GetThreatMgr().isThreatListEmpty())
20006 {
20007 uint32 count = GetThreatMgr().GetThreatList().size();
20008
20009 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
20010 WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
20011 data << GetPackGUID();
20012 data << pHostileReference->getUnitGuid().WriteAsPacked();
20013 data << uint32(count);
20015 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
20016 {
20017 data << (*itr)->getUnitGuid().WriteAsPacked();
20018 data << uint32((*itr)->GetThreat() * 100);
20019 }
20020 SendMessageToSet(&data, false);
20021 }
20022}
@ SMSG_HIGHEST_THREAT_UPDATE
Definition: Opcodes.h:1184
std::list< HostileReference * > StorageType
Definition: ThreatMgr.h:148
PackedGuid WriteAsPacked() const
Definition: ObjectGuid.h:316

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_HIGHEST_THREAT_UPDATE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::setCurrentVictim().

◆ SendClearTarget()

void Unit::SendClearTarget ( )
20216{
20218 data << GetPackGUID();
20219 SendMessageToSet(&data, false);
20220}
@ SMSG_BREAK_TARGET
Definition: Opcodes.h:368

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_BREAK_TARGET.

Referenced by Vehicle::AddPassenger(), and Spell::EffectForceDeselect().

◆ SendClearThreatListOpcode()

void Unit::SendClearThreatListOpcode ( )
20025{
20026 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message");
20028 data << GetPackGUID();
20029 SendMessageToSet(&data, false);
20030}
@ SMSG_THREAT_CLEAR
Definition: Opcodes.h:1187

References Object::GetPackGUID(), LOG_DEBUG, WorldObject::SendMessageToSet(), and SMSG_THREAT_CLEAR.

Referenced by ThreatMgr::ClearAllThreat().

◆ SendComboPoints()

void Unit::SendComboPoints ( )
16796{
16797 if (m_cleanupDone)
16798 {
16799 return;
16800 }
16801
16803 if (Player* playerMe = ToPlayer())
16804 {
16805 WorldPacket data(SMSG_UPDATE_COMBO_POINTS, packGUID.size() + 1);
16806 data << packGUID;
16807 data << uint8(m_comboPoints);
16808 playerMe->SendDirectMessage(&data);
16809 }
16810
16811 ObjectGuid ownerGuid = GetCharmerOrOwnerGUID();
16812 Player* owner = nullptr;
16813 if (ownerGuid.IsPlayer())
16814 {
16815 owner = ObjectAccessor::GetPlayer(*this, ownerGuid);
16816 }
16817
16818 if (m_movedByPlayer || owner)
16819 {
16820 WorldPacket data(SMSG_PET_UPDATE_COMBO_POINTS, GetPackGUID().size() + packGUID.size() + 1);
16821 data << GetPackGUID();
16822 data << packGUID;
16823 data << uint8(m_comboPoints);
16824
16825 if (m_movedByPlayer)
16827
16828 if (owner && owner != m_movedByPlayer)
16829 owner->SendDirectMessage(&data);
16830 }
16831}
@ SMSG_PET_UPDATE_COMBO_POINTS
Definition: Opcodes.h:1200
@ SMSG_UPDATE_COMBO_POINTS
Definition: Opcodes.h:955
Definition: ObjectGuid.h:263
std::size_t size() const
Definition: ObjectGuid.h:274

References GetCharmerOrOwnerGUID(), Object::GetPackGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), m_cleanupDone, m_comboPoints, m_comboTarget, m_movedByPlayer, Player::SendDirectMessage(), PackedGuid::size(), SMSG_PET_UPDATE_COMBO_POINTS, SMSG_UPDATE_COMBO_POINTS, and Object::ToPlayer().

Referenced by AddComboPoints(), and ClearComboPoints().

◆ SendEnergizeSpellLog()

void Unit::SendEnergizeSpellLog ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11182{
11183 WorldPacket data(SMSG_SPELLENERGIZELOG, (8 + 8 + 4 + 4 + 4 + 1));
11184 data << victim->GetPackGUID();
11185 data << GetPackGUID();
11186 data << uint32(spellID);
11187 data << uint32(powerType);
11188 data << uint32(damage);
11189 SendMessageToSet(&data, true);
11190}
@ SMSG_SPELLENERGIZELOG
Definition: Opcodes.h:367

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLENERGIZELOG.

Referenced by EnergizeBySpell(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ SendHealSpellLog()

void Unit::SendHealSpellLog ( HealInfo const &  healInfo,
bool  critical = false 
)
11149{
11150 uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
11151
11152 // we guess size
11153 WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
11154 data << healInfo.GetTarget()->GetPackGUID();
11155 data << GetPackGUID();
11156 data << uint32(healInfo.GetSpellInfo()->Id);
11157 data << uint32(healInfo.GetHeal());
11158 data << uint32(overheal);
11159 data << uint32(healInfo.GetAbsorb()); // Absorb amount
11160 data << uint8(critical ? 1 : 0);
11161 data << uint8(0); // unused
11162 SendMessageToSet(&data, true);
11163}
@ SMSG_SPELLHEALLOG
Definition: Opcodes.h:366

References HealInfo::GetAbsorb(), HealInfo::GetEffectiveHeal(), HealInfo::GetHeal(), Object::GetPackGUID(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SpellInfo::Id, WorldObject::SendMessageToSet(), and SMSG_SPELLHEALLOG.

Referenced by HealBySpell().

◆ SendMeleeAttackStart()

void Unit::SendMeleeAttackStart ( Unit victim,
Player sendTo = nullptr 
)
3026{
3027 WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
3028 data << GetGUID();
3029 data << victim->GetGUID();
3030 if (sendTo)
3031 sendTo->SendDirectMessage(&data);
3032 else
3033 SendMessageToSet(&data, true);
3034 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
3035}
@ SMSG_ATTACKSTART
Definition: Opcodes.h:353

References Object::GetGUID(), LOG_DEBUG, Player::SendDirectMessage(), WorldObject::SendMessageToSet(), and SMSG_ATTACKSTART.

Referenced by Attack(), Player::GetInitialVisiblePackets(), and boss_leotheras_the_blind::Reset().

◆ SendMeleeAttackStop()

void Unit::SendMeleeAttackStop ( Unit victim = nullptr)
3038{
3039 // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating!
3040 // pussywizard: this happens in some boss scripts, just add clearing here
3041 // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now
3042
3043 WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4));
3044 data << GetPackGUID();
3045
3046 if (victim)
3047 {
3048 data << victim->GetPackGUID();
3049 data << (uint32)victim->isDead();
3050 }
3051 SendMessageToSet(&data, true);
3052 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
3053
3054 if (victim)
3055 LOG_DEBUG("entities.unit", "{} {} stopped attacking {} {}", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString(), (victim->IsPlayer() ? "player" : "creature"), victim->GetGUID().ToString());
3056 else
3057 LOG_DEBUG("entities.unit", "{} {} stopped attacking", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString());
3058}
@ SMSG_ATTACKSTOP
Definition: Opcodes.h:354
bool isDead() const
Definition: Unit.h:1152

References Object::GetGUID(), Object::GetPackGUID(), isDead(), Object::IsPlayer(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_ATTACKSTOP, ObjectGuid::ToString(), and Position::ToString().

Referenced by Attack(), AttackStop(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_svalna_revive_champion::Land(), boss_leotheras_the_blind::Reset(), SetControlled(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), and boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI().

◆ SendMonsterMove()

void Unit::SendMonsterMove ( float  NewPosX,
float  NewPosY,
float  NewPosZ,
uint32  TransitTime,
SplineFlags  sf = SPLINEFLAG_WALK_MODE 
)
539{
540 WorldPacket data(SMSG_MONSTER_MOVE, 1 + 12 + 4 + 1 + 4 + 4 + 4 + 12 + GetPackGUID().size());
541 data << GetPackGUID();
542
543 data << uint8(0); // new in 3.1
544 data << GetPositionX() << GetPositionY() << GetPositionZ();
545 data << GameTime::GetGameTimeMS().count();
546 data << uint8(0);
547 data << uint32(sf);
548 data << TransitTime; // Time in between points
549 data << uint32(1); // 1 single waypoint
550 data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
551
552 SendMessageToSet(&data, true);
553}
@ SMSG_MONSTER_MOVE
Definition: Opcodes.h:251

References GameTime::GetGameTimeMS(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::SendMessageToSet(), and SMSG_MONSTER_MOVE.

Referenced by npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI().

◆ SendMovementFeatherFall()

void Unit::SendMovementFeatherFall ( Player sendTo)
20544{
20545 if (!movespline->Initialized())
20546 return;
20548 data << GetPackGUID();
20549 sendTo->SendDirectMessage(&data);
20550}
@ SMSG_SPLINE_MOVE_FEATHER_FALL
Definition: Opcodes.h:803

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_FEATHER_FALL.

Referenced by Player::GetAurasForTarget().

◆ SendMovementFlagUpdate()

void Unit::SendMovementFlagUpdate ( bool  self = false)
16619{
16620 WorldPacket data;
16621 BuildHeartBeatMsg(&data);
16622 SendMessageToSet(&data, self);
16623}
void BuildHeartBeatMsg(WorldPacket *data) const
Definition: Object.cpp:2073

References BuildHeartBeatMsg(), and WorldObject::SendMessageToSet().

Referenced by boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_nightbane::EnterEvadeMode(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_harbinger_skyriss::JustSummoned(), MotionMaster::MoveFall(), npc_twilight_volunteer::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), SetCharm(), SetHover(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ SendMovementHover()

void Unit::SendMovementHover ( Player sendTo)
20581{
20582 if (!movespline->Initialized())
20583 return;
20585 data << GetPackGUID();
20586 sendTo->SendDirectMessage(&data);
20587}
@ SMSG_SPLINE_MOVE_SET_HOVER
Definition: Opcodes.h:805

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_SET_HOVER.

Referenced by Player::GetAurasForTarget().

◆ SendMovementWaterWalking()

void Unit::SendMovementWaterWalking ( Player sendTo)
20522{
20523 if (!movespline->Initialized())
20524 return;
20526 data << GetPackGUID();
20527 sendTo->SendDirectMessage(&data);
20528}
@ SMSG_SPLINE_MOVE_WATER_WALK
Definition: Opcodes.h:807

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ SendPeriodicAuraLog()

void Unit::SendPeriodicAuraLog ( SpellPeriodicAuraLogInfo pInfo)
6334{
6335 AuraEffect const* aura = pInfo->auraEff;
6337 data << GetPackGUID();
6338 data << aura->GetCasterGUID().WriteAsPacked();
6339 data << uint32(aura->GetId()); // spellId
6340 data << uint32(1); // count
6341 data << uint32(aura->GetAuraType()); // auraId
6342 switch (aura->GetAuraType())
6343 {
6346 {
6347 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6348 uint32 damage = pInfo->damage;
6349 uint32 absorb = pInfo->absorb;
6350 if (IsPlayer() && ToPlayer()->GetCommandStatus(CHEAT_GOD))
6351 {
6352 absorb = damage;
6353 damage = 0;
6354 }
6355
6356 data << uint32(damage); // damage
6357 data << uint32(pInfo->overDamage); // overkill?
6358 data << uint32(aura->GetSpellInfo()->GetSchoolMask());
6359 data << uint32(absorb); // absorb
6360 data << uint32(pInfo->resist); // resist
6361 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6362 }
6363 break;
6366 data << uint32(pInfo->damage); // damage
6367 data << uint32(pInfo->overDamage); // overheal
6368 data << uint32(pInfo->absorb); // absorb
6369 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6370 break;
6373 data << uint32(aura->GetMiscValue()); // power type
6374 data << uint32(pInfo->damage); // damage
6375 break;
6377 data << uint32(aura->GetMiscValue()); // power type
6378 data << uint32(pInfo->damage); // amount
6379 data << float(pInfo->multiplier); // gain multiplier
6380 break;
6381 default:
6382 LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura {}", uint32(aura->GetAuraType()));
6383 return;
6384 }
6385
6386 SendMessageToSet(&data, true);
6387}
@ SPELL_AURA_OBS_MOD_HEALTH
Definition: SpellAuraDefines.h:83
@ SPELL_AURA_PERIODIC_MANA_LEECH
Definition: SpellAuraDefines.h:127
@ SPELL_AURA_PERIODIC_ENERGIZE
Definition: SpellAuraDefines.h:87
@ SMSG_PERIODICAURALOG
Definition: Opcodes.h:620
float multiplier
Definition: Unit.h:521
bool critical
Definition: Unit.h:522
uint32 overDamage
Definition: Unit.h:518
uint32 resist
Definition: Unit.h:520
uint32 damage
Definition: Unit.h:517
AuraEffect const * auraEff
Definition: Unit.h:516
uint32 absorb
Definition: Unit.h:519

References SpellPeriodicAuraLogInfo::absorb, SpellPeriodicAuraLogInfo::auraEff, CHEAT_GOD, SpellPeriodicAuraLogInfo::critical, SpellPeriodicAuraLogInfo::damage, AuraEffect::GetAuraType(), AuraEffect::GetCasterGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), Object::GetPackGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Object::IsPlayer(), LOG_ERROR, SpellPeriodicAuraLogInfo::multiplier, SpellPeriodicAuraLogInfo::overDamage, SpellPeriodicAuraLogInfo::resist, WorldObject::SendMessageToSet(), SMSG_PERIODICAURALOG, SPELL_AURA_OBS_MOD_HEALTH, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_ENERGIZE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_MANA_LEECH, Object::ToPlayer(), and ObjectGuid::WriteAsPacked().

Referenced by AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SendPetActionFeedback()

void Unit::SendPetActionFeedback ( uint8  msg)

-------—Pet responses methods--------------—

16523{
16524 Unit* owner = GetOwner();
16525 if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
16526 return;
16527
16529 data << uint8(msg);
16530 owner->ToPlayer()->GetSession()->SendPacket(&data);
16531}
@ SMSG_PET_ACTION_FEEDBACK
Definition: Opcodes.h:740

References GetOwner(), Player::GetSession(), Object::GetTypeId(), WorldSession::SendPacket(), SMSG_PET_ACTION_FEEDBACK, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by WorldSession::HandlePetCancelAuraOpcode().

◆ SendPetAIReaction()

void Unit::SendPetAIReaction ( ObjectGuid  guid)
16546{
16547 Unit* owner = GetOwner();
16548 if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
16549 return;
16550
16551 WorldPacket data(SMSG_AI_REACTION, 8 + 4);
16552 data << guid;
16553 data << uint32(AI_REACTION_HOSTILE);
16554 owner->ToPlayer()->GetSession()->SendPacket(&data);
16555}
@ SMSG_AI_REACTION
Definition: Opcodes.h:346

References AI_REACTION_HOSTILE, GetOwner(), Player::GetSession(), Object::GetTypeId(), WorldSession::SendPacket(), SMSG_AI_REACTION, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by PetAI::DoAttack(), and WorldSession::HandlePetActionHelper().

◆ SendPetTalk()

void Unit::SendPetTalk ( uint32  pettalk)
16534{
16535 Unit* owner = GetOwner();
16536 if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
16537 return;
16538
16540 data << GetGUID();
16541 data << uint32(pettalk);
16542 owner->ToPlayer()->GetSession()->SendPacket(&data);
16543}
@ SMSG_PET_ACTION_SOUND
Definition: Opcodes.h:834

References Object::GetGUID(), GetOwner(), Player::GetSession(), Object::GetTypeId(), WorldSession::SendPacket(), SMSG_PET_ACTION_SOUND, Object::ToPlayer(), and TYPEID_PLAYER.

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPlaySpellImpact()

void Unit::SendPlaySpellImpact ( ObjectGuid  guid,
uint32  id 
)
18823{
18825 data << guid; // target
18826 data << uint32(id); // SpellVisualKit.dbc index
18827 SendMessageToSet(&data, true);
18828}
@ SMSG_PLAY_SPELL_IMPACT
Definition: Opcodes.h:533

References WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_IMPACT.

Referenced by debug_commandscript::HandleDebugVisualCommand(), and WorldSession::HandleTrainerBuySpellOpcode().

◆ SendPlaySpellVisual()

void Unit::SendPlaySpellVisual ( uint32  id)
18815{
18817 data << GetGUID();
18818 data << uint32(id); // SpellVisualKit.dbc index
18819 SendMessageToSet(&data, true);
18820}
@ SMSG_PLAY_SPELL_VISUAL
Definition: Opcodes.h:529

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_VISUAL.

Referenced by debug_commandscript::HandleDebugVisualCommand(), WorldSession::HandleTrainerBuySpellOpcode(), and Player::RegenerateAll().

◆ SendRemoveFromThreatListOpcode()

void Unit::SendRemoveFromThreatListOpcode ( HostileReference pHostileReference)
20033{
20034 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
20035 WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
20036 data << GetPackGUID();
20037 data << pHostileReference->getUnitGuid().WriteAsPacked();
20038 SendMessageToSet(&data, false);
20039}
@ SMSG_THREAT_REMOVE
Definition: Opcodes.h:1186

References Object::GetPackGUID(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_THREAT_REMOVE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::processThreatEvent().

◆ SendSpellDamageImmune()

void Unit::SendSpellDamageImmune ( Unit target,
uint32  spellId 
)
6414{
6415 WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8 + 8 + 4 + 1);
6416 data << GetGUID();
6417 data << target->GetGUID();
6418 data << uint32(spellId);
6419 data << uint8(0); // bool - log format: 0-default, 1-debug
6420 SendMessageToSet(&data, true);
6421}
@ SMSG_SPELLORDAMAGE_IMMUNE
Definition: Opcodes.h:641

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLORDAMAGE_IMMUNE.

Referenced by DealMeleeDamage(), and AuraEffect::SendTickImmune().

◆ SendSpellDamageResist()

void Unit::SendSpellDamageResist ( Unit target,
uint32  spellId 
)
6404{
6405 WorldPacket data(SMSG_PROCRESIST, 8 + 8 + 4 + 1);
6406 data << GetGUID();
6407 data << target->GetGUID();
6408 data << uint32(spellId);
6409 data << uint8(0); // bool - log format: 0-default, 1-debug
6410 SendMessageToSet(&data, true);
6411}
@ SMSG_PROCRESIST
Definition: Opcodes.h:638

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PROCRESIST.

◆ SendSpellMiss()

void Unit::SendSpellMiss ( Unit target,
uint32  spellID,
SpellMissInfo  missInfo 
)
6390{
6391 WorldPacket data(SMSG_SPELLLOGMISS, (4 + 8 + 1 + 4 + 8 + 1));
6392 data << uint32(spellID);
6393 data << GetGUID();
6394 data << uint8(0); // can be 0 or 1
6395 data << uint32(1); // target count
6396 // for (i = 0; i < target count; ++i)
6397 data << target->GetGUID(); // target GUID
6398 data << uint8(missInfo);
6399 // end loop
6400 SendMessageToSet(&data, true);
6401}
@ SMSG_SPELLLOGMISS
Definition: Opcodes.h:617

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLLOGMISS.

Referenced by DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ SendSpellNonMeleeDamageLog() [1/2]

void Unit::SendSpellNonMeleeDamageLog ( SpellNonMeleeDamage log)
6255{
6256 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6257 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6258 uint32 damage = log->damage;
6259 uint32 absorb = log->absorb;
6260 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6261 {
6262 absorb = damage;
6263 damage = 0;
6264 }
6265 data << log->target->GetPackGUID();
6266 data << log->attacker->GetPackGUID();
6267 data << uint32(log->spellInfo->Id);
6268 data << uint32(damage); // damage amount
6269 int32 overkill = damage - log->target->GetHealth();
6270 data << uint32(overkill > 0 ? overkill : 0); // overkill
6271 data << uint8 (log->schoolMask); // damage school
6272 data << uint32(absorb); // AbsorbedDamage
6273 data << uint32(log->resist); // resist
6274 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6275 data << uint8 (log->unused); // unused
6276 data << uint32(log->blocked); // blocked
6277 data << uint32(log->HitInfo);
6278 data << uint32(log->HitInfo);
6280 //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
6281 //{
6282 // data << float(log->CritRoll);
6283 // data << float(log->CritNeeded);
6284 //}
6285 //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
6286 //{
6287 // data << float(log->HitRoll);
6288 // data << float(log->HitNeeded);
6289 //}
6290 //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
6291 //{
6292 // data << float(log->MissChance);
6293 // data << float(log->DodgeChance);
6294 // data << float(log->ParryChance);
6295 // data << float(log->BlockChance);
6296 // data << float(log->GlanceChance);
6297 // data << float(log->CrushChance);
6298 //}
6299 SendMessageToSet(&data, true);
6300}
@ SPELL_HIT_TYPE_HIT_DEBUG
Definition: SharedDefines.h:1537
@ SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG
Definition: SharedDefines.h:1540
@ SPELL_HIT_TYPE_CRIT_DEBUG
Definition: SharedDefines.h:1535
@ SMSG_SPELLNONMELEEDAMAGELOG
Definition: Opcodes.h:622
bool physicalLog
Definition: Unit.h:503
bool unused
Definition: Unit.h:504

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, WorldObject::SendMessageToSet(), SMSG_SPELLNONMELEEDAMAGELOG, SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG, SPELL_HIT_TYPE_CRIT_DEBUG, SPELL_HIT_TYPE_HIT_DEBUG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by CalcAbsorbResist(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectEnvironmentalDMG(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and SendSpellNonMeleeDamageLog().

◆ SendSpellNonMeleeDamageLog() [2/2]

void Unit::SendSpellNonMeleeDamageLog ( Unit target,
SpellInfo const *  spellInfo,
uint32  Damage,
SpellSchoolMask  damageSchoolMask,
uint32  AbsorbedDamage,
uint32  Resist,
bool  PhysicalDamage,
uint32  Blocked,
bool  CriticalHit = false,
bool  Split = false 
)
6303{
6304 SpellNonMeleeDamage log(this, target, spellInfo, damageSchoolMask);
6305 log.damage = Damage;
6306 log.absorb = AbsorbedDamage;
6307 log.resist = Resist;
6308 log.physicalLog = PhysicalDamage;
6309 log.blocked = Blocked;
6310 log.HitInfo = 0;
6311 if (CriticalHit)
6312 {
6313 log.HitInfo |= SPELL_HIT_TYPE_CRIT;
6314 }
6315 if (Split)
6316 {
6317 log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
6318 }
6320}
@ SPELL_HIT_TYPE_SPLIT
Definition: SharedDefines.h:1538
Definition: Unit.h:489

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, SpellNonMeleeDamage::damage, SpellNonMeleeDamage::HitInfo, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SendSpellNonMeleeDamageLog(), SPELL_HIT_TYPE_CRIT, and SPELL_HIT_TYPE_SPLIT.

◆ SendSpellNonMeleeReflectLog()

void Unit::SendSpellNonMeleeReflectLog ( SpellNonMeleeDamage log,
Unit attacker 
)
6223{
6224 // Xinef: function for players only, placed in unit because of cosmetics
6225 if (GetTypeId() != TYPEID_PLAYER)
6226 return;
6227
6228 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6229 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6230 uint32 damage = log->damage;
6231 uint32 absorb = log->absorb;
6232 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6233 {
6234 absorb = damage;
6235 damage = 0;
6236 }
6237 data << log->target->GetPackGUID();
6238 data << attacker->GetPackGUID();
6239 data << uint32(log->spellInfo->Id);
6240 data << uint32(damage); // damage amount
6241 int32 overkill = damage - log->target->GetHealth();
6242 data << uint32(overkill > 0 ? overkill : 0); // overkill
6243 data << uint8 (log->schoolMask); // damage school
6244 data << uint32(absorb); // AbsorbedDamage
6245 data << uint32(log->resist); // resist
6246 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6247 data << uint8 (log->unused); // unused
6248 data << uint32(log->blocked); // blocked
6249 data << uint32(log->HitInfo);
6250 data << uint8 (0); // flag to use extend data
6251 ToPlayer()->SendDirectMessage(&data);
6252}

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), Object::GetTypeId(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, Player::SendDirectMessage(), SMSG_SPELLNONMELEEDAMAGELOG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), TYPEID_PLAYER, and SpellNonMeleeDamage::unused.

Referenced by Spell::DoAllEffectOnTarget().

◆ SendTameFailure()

void Unit::SendTameFailure ( uint8  result)
19905{
19907 data << uint8(result);
19908 ToPlayer()->SendDirectMessage(&data);
19909}
@ SMSG_PET_TAME_FAILURE
Definition: Opcodes.h:401

References Player::SendDirectMessage(), SMSG_PET_TAME_FAILURE, and Object::ToPlayer().

Referenced by spell_hun_tame_beast::CheckCast(), and Spell::CheckCast().

◆ SendTeleportPacket()

void Unit::SendTeleportPacket ( Position pos)

◆ SendThreatListUpdate()

void Unit::SendThreatListUpdate ( )
19984{
19985 if (!GetThreatMgr().isThreatListEmpty())
19986 {
19987 uint32 count = GetThreatMgr().GetThreatList().size();
19988
19989 //LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
19990 WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
19991 data << GetPackGUID();
19992 data << uint32(count);
19994 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
19995 {
19996 data << (*itr)->getUnitGuid().WriteAsPacked();
19997 data << uint32((*itr)->GetThreat() * 100);
19998 }
19999 SendMessageToSet(&data, false);
20000 }
20001}
@ SMSG_THREAT_UPDATE
Definition: Opcodes.h:1185

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::SendMessageToSet(), and SMSG_THREAT_UPDATE.

Referenced by Update().

◆ SetAI()

void Unit::SetAI ( UnitAI newAI)
inline
657{ i_AI = newAI; }

References i_AI.

◆ SetArmor()

void Unit::SetArmor ( int32  val)
inline

◆ SetAttackTime()

◆ setAttackTimer()

◆ SetAuraStack()

void Unit::SetAuraStack ( uint32  spellId,
Unit target,
uint32  stack 
)
18806{
18807 Aura* aura = target->GetAura(spellId, GetGUID());
18808 if (!aura)
18809 aura = AddAura(spellId, target);
18810 if (aura && stack)
18811 aura->SetStackAmount(stack);
18812}
void SetStackAmount(uint8 num)
Definition: SpellAuras.cpp:995

References AddAura(), GetAura(), Object::GetGUID(), and Aura::SetStackAmount().

Referenced by boss_viscidus::DamageTaken(), spell_capacitus_polarity_charge::HandleTargets(), spell_thaddius_pos_neg_charge::HandleTargets(), and BattlefieldWG::OnPlayerJoinWar().

◆ SetBaseWeaponDamage()

void Unit::SetBaseWeaponDamage ( WeaponAttackType  attType,
WeaponDamageRange  damageRange,
float  value,
uint8  damageIndex = 0 
)
inline
1460{ m_weaponDamage[attType][damageRange][damageIndex] = value; }

References m_weaponDamage.

Referenced by Player::_ApplyWeaponDamage(), Guardian::InitStatsForLevel(), and Creature::SelectLevel().

◆ SetCanDualWield()

virtual void Unit::SetCanDualWield ( bool  value)
inlinevirtual

◆ SetCanFly()

bool Unit::SetCanFly ( bool  enable,
bool  packetOnly = false 
)
virtual

◆ SetCanModifyStats()

◆ SetCantProc()

void Unit::SetCantProc ( bool  apply)
inline
1664 {
1665 if (apply)
1666 ++m_procDeep;
1667 else
1668 {
1670 --m_procDeep;
1671 }
1672 }

References ASSERT, and m_procDeep.

Referenced by HandleDummyAuraProc(), and ProcDamageAndSpellFor().

◆ SetCharm()

void Unit::SetCharm ( Unit target,
bool  apply 
)
Todo:
: maybe we can use this flag to check if controlled by player
10798{
10799 if (apply)
10800 {
10801 if (IsPlayer())
10802 {
10803 if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10804 LOG_FATAL("entities.unit", "Player {} is trying to charm unit {}, but it already has a charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10805
10806 charm->m_ControlledByPlayer = true;
10808 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10809 }
10810 else
10811 charm->m_ControlledByPlayer = false;
10812
10813 // PvP, FFAPvP
10814 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
10815
10816 if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10817 LOG_FATAL("entities.unit", "Unit {} is being charmed, but it already has a charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10818
10819 _isWalkingBeforeCharm = charm->IsWalking();
10821 {
10822 charm->SetWalk(false);
10823 charm->SendMovementFlagUpdate();
10824 }
10825
10826 m_Controlled.insert(charm);
10827 }
10828 else
10829 {
10830 if (IsPlayer())
10831 {
10832 if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10833 LOG_FATAL("entities.unit", "Player {} is trying to uncharm unit {}, but it has another charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10834 }
10835
10836 if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10837 LOG_FATAL("entities.unit", "Unit {} is being uncharmed, but it has another charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10838
10839 if (charm->IsPlayer())
10840 {
10841 charm->m_ControlledByPlayer = true;
10842 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10843 charm->ToPlayer()->UpdatePvPState();
10844 }
10845 else if (Player* player = charm->GetCharmerOrOwnerPlayerOrPlayerItself())
10846 {
10847 charm->m_ControlledByPlayer = true;
10848 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10849 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, player->GetByteValue(UNIT_FIELD_BYTES_2, 1));
10850
10851 // Xinef: skip controlled erase if charmed unit is owned by charmer
10852 if (charm->IsInWorld() && !charm->IsDuringRemoveFromWorld() && player->GetGUID() == this->GetGUID() && (charm->IsPet() || charm->HasUnitTypeMask(UNIT_MASK_MINION)))
10853 return;
10854 }
10855 else
10856 {
10857 charm->m_ControlledByPlayer = false;
10858 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10859 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);
10860 }
10861
10862 if (charm->IsWalking() != _isWalkingBeforeCharm)
10863 {
10864 charm->SetWalk(_isWalkingBeforeCharm);
10865 charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player.
10866 }
10867
10868 m_Controlled.erase(charm);
10869 }
10870}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:686
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition: Object.cpp:704

References _isWalkingBeforeCharm, Object::AddGuidValue(), Object::GetByteValue(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), HasUnitTypeMask(), IsDuringRemoveFromWorld(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), IsWalking(), LOG_FATAL, m_Controlled, m_ControlledByPlayer, Object::RemoveGuidValue(), RemoveUnitFlag(), SendMovementFlagUpdate(), Object::SetByteValue(), SetUnitFlag(), SetWalk(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), UNIT_FIELD_BYTES_2, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MASK_MINION, and Player::UpdatePvPState().

Referenced by RemoveCharmedBy(), SetCharmedBy(), and Player::StopCastingCharm().

◆ SetCharmedBy()

bool Unit::SetCharmedBy ( Unit charmer,
CharmType  type,
AuraApplication const *  aurApp = nullptr 
)
18254{
18255 if (!charmer)
18256 return false;
18257
18258 if (!charmer->IsInWorld() || charmer->IsDuringRemoveFromWorld())
18259 {
18260 return false;
18261 }
18262
18263 // dismount players when charmed
18264 if (IsPlayer())
18266
18267 if (charmer->IsPlayer())
18269
18270 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18271 if (type == CHARM_TYPE_VEHICLE && !IsVehicle()) // pussywizard
18272 throw 1;
18273 ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle());
18274
18275 LOG_DEBUG("entities.unit", "SetCharmedBy: charmer {} ({}), charmed {} ({}), type {}.",
18276 charmer->GetEntry(), charmer->GetGUID().ToString(), GetEntry(), GetGUID().ToString(), uint32(type));
18277
18278 if (this == charmer)
18279 {
18280 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Unit {} ({}) is trying to charm itself!", GetEntry(), GetGUID().ToString());
18281 return false;
18282 }
18283
18284 //if (HasUnitState(UNIT_STATE_UNATTACKABLE))
18285 // return false;
18286
18287 if (IsPlayer() && ToPlayer()->GetTransport())
18288 {
18289 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Player on transport is trying to charm {} ({})", GetEntry(), GetGUID().ToString());
18290 return false;
18291 }
18292
18293 // Already charmed
18294 if (GetCharmerGUID())
18295 {
18296 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) has already been charmed but {} ({}) is trying to charm it!",
18297 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18298 return false;
18299 }
18300
18301 CastStop();
18302 AttackStop();
18303
18304 // Xinef: dont reset threat and combat, put them on offline list, moved down after faction changes
18305 // CombatStop(); /// @todo: CombatStop(true) may cause crash (interrupt spells)
18306 // DeleteThreatList();
18307
18308 Player* playerCharmer = charmer->ToPlayer();
18309
18310 // Charmer stop charming
18311 if (playerCharmer)
18312 {
18313 playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18314 playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18315 }
18316
18317 // Charmed stop charming
18318 if (IsPlayer())
18319 {
18320 ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18321 ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18322 }
18323
18324 // StopCastingCharm may remove a possessed pet?
18325 if (!IsInWorld())
18326 {
18327 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) is not in world but {} ({}) is trying to charm it!",
18328 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18329 return false;
18330 }
18331
18332 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18333 // prevent undefined behaviour
18334 if (aurApp && aurApp->GetRemoveMode())
18335 return false;
18336
18338 SetFaction(charmer->GetFaction());
18339
18340 // Set charmed
18341 charmer->SetCharm(this, true);
18342
18344
18345 if (GetTypeId() == TYPEID_UNIT)
18346 {
18347 GetMotionMaster()->Clear(false);
18349 StopMoving();
18350
18351 if (charmer->IsPlayer() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM) && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
18352 {
18353 // Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
18354 Creature* charmed = ToCreature();
18355 charmed->NeedChangeAI = true;
18356 charmed->IsAIEnabled = false;
18357 }
18358 else
18359 {
18360 ToCreature()->AI()->OnCharmed(true);
18361 }
18362
18363 // Xinef: If creature can fly, add normal player flying flag (fixes speed)
18364 if (charmer->IsPlayer() && ToCreature()->CanFly())
18366 }
18367 else
18368 {
18369 Player* player = ToPlayer();
18370 if (player->isAFK())
18371 player->ToggleAFK();
18372
18373 player->SetClientControl(this, false); // verified
18374 }
18375
18376 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18377 // prevent undefined behaviour
18378 if (aurApp && aurApp->GetRemoveMode())
18379 return false;
18380
18381 // Pets already have a properly initialized CharmInfo, don't overwrite it.
18382 // Xinef: I need charmInfo for vehicle
18383 if (/*type != CHARM_TYPE_VEHICLE &&*/ !GetCharmInfo())
18384 {
18385 InitCharmInfo();
18386 if (type == CHARM_TYPE_POSSESS)
18388 else if (type != CHARM_TYPE_VEHICLE)
18389 {
18391
18392 // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers
18393 if (type == CHARM_TYPE_CONVERT && GetTypeId() == TYPEID_UNIT)
18395 }
18396 }
18397
18398 if (playerCharmer)
18399 {
18400 switch (type)
18401 {
18402 case CHARM_TYPE_VEHICLE:
18405 playerCharmer->SetClientControl(this, true); // verified
18406 playerCharmer->VehicleSpellInitialize();
18407 break;
18408 case CHARM_TYPE_POSSESS:
18413 playerCharmer->SetClientControl(this, true); // verified
18414 playerCharmer->PossessSpellInitialize();
18415 break;
18416 case CHARM_TYPE_CHARM:
18418 {
18420 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18421 {
18422 // to prevent client crash
18424
18425 // just to enable stat window
18426 if (GetCharmInfo())
18427 GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
18428
18429 // if charmed two demons the same session, the 2nd gets the 1st one's name
18430 SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
18431 }
18432 }
18433 if (playerCharmer->m_seer != this)
18434 {
18436 playerCharmer->CharmSpellInitialize();
18437 }
18438 break;
18439 default:
18440 break;
18441 }
18442 }
18443 else if (IsPlayer())
18445
18446 if (Creature* creature = ToCreature())
18447 creature->RefreshSwimmingFlag();
18448
18449 if (IsPlayer())
18450 sScriptMgr->OnPlayerBeingCharmed(ToPlayer(), charmer, _oldFactionId, charmer->GetFaction());
18451
18452 return true;
18453}
@ CHARM_TYPE_CONVERT
Definition: CharmInfo.h:47
@ REACT_DEFENSIVE
Definition: Unit.h:549
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition: UpdateFields.h:133
void OnCharmed(bool apply) override
Definition: CreatureAI.cpp:33
void SetReactState(ReactStates st)
Definition: Creature.h:91
void CharmSpellInitialize()
Definition: Player.cpp:9599
WorldObject * m_seer
Definition: Player.h:2310
void ToggleAFK()
Definition: Player.cpp:1288
void PossessSpellInitialize()
Definition: Player.cpp:9496
bool isAFK() const
Definition: Player.h:1133
void VehicleSpellInitialize()
Definition: Player.cpp:9524
void StopCastingBindSight(Aura *except=nullptr)
Definition: Player.cpp:13103
void InitPossessCreateSpells()
Definition: CharmInfo.cpp:77
void InitCharmCreateSpells()
Definition: CharmInfo.cpp:113
virtual float GetFollowAngle() const
Definition: Unit.h:1734
CharmInfo * InitCharmInfo()
Definition: Unit.cpp:15725
void MoveIdle()
Definition: MotionMaster.cpp:232

References _oldFactionId, AddUnitMovementFlag(), AddUnitState(), Creature::AI(), ASSERT, AttackStop(), CanFly(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_CONVERT, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, Player::CharmSpellInitialize(), CLASS_CONTEXT_PET_CHARM, CLASS_MAGE, CLASS_WARLOCK, MotionMaster::Clear(), CREATURE_TYPE_DEMON, AuraApplication::GetBase(), GetCharmerGUID(), GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFaction(), GetFollowAngle(), GameTime::GetGameTime(), Object::GetGUID(), GetMotionMaster(), AuraApplication::GetRemoveMode(), WorldObject::GetTransport(), Object::GetTypeId(), CharmInfo::InitCharmCreateSpells(), InitCharmInfo(), CharmInfo::InitPossessCreateSpells(), Player::isAFK(), IsAIEnabled, IsClass(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Object::IsPlayer(), IsVehicle(), LOG_DEBUG, LOG_FATAL, Player::m_seer, MotionMaster::MoveFollow(), MotionMaster::MoveIdle(), MOVEMENTFLAG_FLYING, NeedChangeAI, CreatureAI::OnCharmed(), PET_FOLLOW_DIST, Player::PossessSpellInitialize(), REACT_DEFENSIVE, RemoveAurasByType(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), Creature::SetReactState(), SetUInt32Value(), SetUnitFlag(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sScriptMgr, StopAttackingInvalidTarget(), Player::StopCastingBindSight(), Player::StopCastingCharm(), StopMoving(), Object::ToCreature(), Player::ToggleAFK(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), CreatureTemplate::type, TYPEID_UNIT, UNIT_FIELD_BYTES_0, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, and Player::VehicleSpellInitialize().

Referenced by Vehicle::AddPassenger(), AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), and Puppet::InitSummon().

◆ SetCharmerGUID()

void Unit::SetCharmerGUID ( ObjectGuid  owner)
inline

◆ SetCombatTimer()

void Unit::SetCombatTimer ( uint32  timer)
inline
1042{ m_CombatTimer = timer; }

References m_CombatTimer.

◆ SetConfused()

void Unit::SetConfused ( bool  apply)
protected
18222{
18223 if (apply)
18224 {
18225 SetTarget();
18227 }
18228 else
18229 {
18230 if (IsAlive())
18231 {
18232 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == CONFUSED_MOTION_TYPE)
18233 {
18235 StopMoving();
18236 }
18237
18238 if (GetVictim())
18240 }
18241 }
18242
18243 // xinef: block / allow control to real mover (eg. charmer)
18244 if (IsPlayer())
18245 {
18246 if (m_movedByPlayer)
18247 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18248 //else
18249 // ToPlayer()->SetClientControl(this, !apply);
18250 }
18251}
@ CONFUSED_MOTION_TYPE
Definition: MotionMaster.h:42
void MoveConfused()
Definition: MotionMaster.cpp:282

References CONFUSED_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveConfused(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), and Object::ToPlayer().

Referenced by SetControlled().

◆ SetContestedPvP()

void Unit::SetContestedPvP ( Player attackedPlayer = nullptr,
bool  lookForNearContestedGuards = true 
)
17163{
17165
17166 if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->Opponent == attackedPlayer))) || player->InBattleground()))
17167 return;
17168
17169 // check if there any guards that should care about the contested flag on player
17170 if (lookForNearContestedGuards)
17171 {
17172 std::list<Unit*> targets;
17175 Cell::VisitAllObjects(this, searcher, MAX_AGGRO_RADIUS);
17176
17177 // return if there are no contested guards found
17178 if (!targets.size())
17179 {
17180 return;
17181 }
17182 }
17183
17184 player->SetContestedPvPTimer(30000);
17186 {
17189 // call MoveInLineOfSight for nearby contested guards
17191 }
17193 {
17195 // call MoveInLineOfSight for nearby contested guards
17197 }
17198}
#define MAX_AGGRO_RADIUS
Definition: Unit.h:43
void SetPlayerFlag(PlayerFlags flags)
Definition: Player.h:1108
bool InBattleground() const
Definition: Player.h:2228
void SetContestedPvPTimer(uint32 newTime)
Definition: Player.h:1845

References WorldObject::AddToNotify(), AddUnitState(), Player::duel, GetCharmerOrOwnerPlayerOrPlayerItself(), HasUnitState(), Player::InBattleground(), MAX_AGGRO_RADIUS, NOTIFY_AI_RELOCATION, PLAYER_FLAGS_CONTESTED_PVP, Player::SetContestedPvPTimer(), Player::SetPlayerFlag(), UNIT_STATE_ATTACK_PLAYER, and Cell::VisitAllObjects().

Referenced by CombatStart(), CombatStartOnCast(), Spell::DoSpellHitOnUnit(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetControlled()

void Unit::SetControlled ( bool  apply,
UnitState  state,
Unit source = nullptr,
bool  isFear = false 
)
17938{
17939 if (apply)
17940 {
17941 if (HasUnitState(state))
17942 return;
17943
17944 AddUnitState(state);
17945 switch (state)
17946 {
17947 case UNIT_STATE_STUNNED:
17948 SetStunned(true);
17949 break;
17950 case UNIT_STATE_ROOT:
17952 SetRooted(true);
17953 break;
17956 {
17959 // SendAutoRepeatCancel ?
17960 SetConfused(true);
17961 CastStop(0, false);
17962 }
17963 break;
17964 case UNIT_STATE_FLEEING:
17966 {
17969 // SendAutoRepeatCancel ?
17970 SetFeared(true, source, isFear);
17971 CastStop(0, false);
17972 }
17973 break;
17974 default:
17975 break;
17976 }
17977
17978 if (IsPlayer())
17979 {
17980 sScriptMgr->AnticheatSetRootACKUpd(ToPlayer());
17981 }
17982 }
17983 else
17984 {
17985 // xinef: moved from below, checked all SetX functions, no calls to currently modified state
17986 // xinef: added to each case because of return
17987 //ClearUnitState(state);
17988
17989 switch (state)
17990 {
17991 case UNIT_STATE_STUNNED:
17993 return;
17994 ClearUnitState(state);
17995 SetStunned(false);
17996 break;
17997 case UNIT_STATE_ROOT:
17998 // Prevent creature_template_movement rooted flag from being removed on aura expiration.
17999 if (GetTypeId() == TYPEID_UNIT)
18000 {
18001 if (ToCreature()->GetCreatureTemplate()->Movement.Rooted)
18002 {
18003 return;
18004 }
18005 }
18006
18008 return;
18009 ClearUnitState(state);
18010 SetRooted(false);
18011 break;
18014 return;
18015 ClearUnitState(state);
18016 SetConfused(false);
18017 break;
18018 case UNIT_STATE_FLEEING:
18020 return;
18021 ClearUnitState(state);
18022 SetFeared(false);
18023 break;
18024 default:
18025 return;
18026 }
18027
18028 //ClearUnitState(state);
18029
18031 SetStunned(true);
18032 else
18033 {
18035 SetRooted(true);
18036
18038 SetConfused(true);
18040 {
18041 bool isFear = false;
18043 {
18044 isFear = true;
18045 source = ObjectAccessor::GetUnit(*this, GetAuraEffectsByType(SPELL_AURA_MOD_FEAR).front()->GetCasterGUID());
18046 }
18047
18048 if (!source)
18049 {
18050 source = getAttackerForHelper();
18051 }
18052
18053 SetFeared(true, source, isFear);
18054 }
18055 }
18056 }
18057}
Definition: Unit.h:257
void SetFeared(bool apply, Unit *fearedBy=nullptr, bool isFear=false)
Definition: Unit.cpp:18189
void SetConfused(bool apply)
Definition: Unit.cpp:18221
void SetStunned(bool apply)
Definition: Unit.cpp:18059
Unit * getAttackerForHelper() const
Definition: Unit.h:706
void SetRooted(bool apply, bool isStun=false)
Definition: Unit.cpp:18107

References AddUnitState(), CastStop(), ClearUnitState(), getAttackerForHelper(), GetAuraEffectsByType(), Object::GetTypeId(), ObjectAccessor::GetUnit(), GetVehicle(), HasAuraType(), HasUnitState(), Object::IsPlayer(), SendMeleeAttackStop(), SetConfused(), SetFeared(), SetRooted(), SetStunned(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), TYPEID_UNIT, UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, UNIT_STATE_MELEE_ATTACKING, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by _ExitVehicle(), Vehicle::AddPassenger(), boss_ahune::boss_ahune(), boss_ouro::boss_ouro(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_palehoof::boss_palehoofAI::DoAction(), Creature::DoFleeToGetAssistance(), boss_skeram::DoTeleport(), CritterAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_falric::boss_falricAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_noth::boss_nothAI::EnterEvadeMode(), boss_thaddius_summon::boss_thaddius_summonAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::EnterEvadeMode(), boss_svala::boss_svalaAI::EnterEvadeMode(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_shirrak_the_dead_watcher::EnterEvadeMode(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleAuraModRoot(), AuraEffect::HandleAuraModStun(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_gen_visual_dummy_stun::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_gen_visual_dummy_stun::HandleEffectRemove(), AuraEffect::HandleModConfuse(), AuraEffect::HandleModFear(), AuraEffect::HandlePreventFleeing(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_volazj::JustDied(), CritterAI::JustEngagedWith(), boss_skadi::boss_skadiAI::JustEngagedWith(), boss_skeram::JustSummoned(), npc_twilight_volunteer::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), npc_gunship_gunner::npc_gunship_gunnerAI::MovementInform(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_iron_watcher::npc_iron_watcherAI::MovementInform(), npc_buru_egg::npc_buru_egg(), npc_icc_blood_beast::npc_icc_blood_beastAI::npc_icc_blood_beastAI(), npc_raging_spirit::npc_raging_spiritAI::npc_raging_spiritAI(), npc_vengeful_shade::npc_vengeful_shadeAI::npc_vengeful_shadeAI(), spell_systems_shutdown_aura::OnApply(), spell_systems_shutdown_aura::OnRemove(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_skeram::Reset(), boss_volazj::Reset(), npc_twilight_summon::npc_twilight_summonAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_thaddius_summon::boss_thaddius_summonAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_thorim_pillar::boss_thorim_pillarAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), boss_skadi::boss_skadiAI::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_iron_watcher::npc_iron_watcherAI::Reset(), boss_shirrak_the_dead_watcher::Reset(), npc_target_dummy::npc_target_dummyAI::Reset(), Player::SetClientControl(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_noth::boss_nothAI::StartGroundPhase(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonedCreatureDies(), boss_skeram::UpdateAI(), boss_volazj::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), npc_icc_blood_beast::npc_icc_blood_beastAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ SetCreateHealth()

◆ SetCreateMana()

◆ SetCreateStat()

void Unit::SetCreateStat ( Stats  stat,
float  val 
)
inline

◆ SetCreatorGUID()

◆ SetCritterGUID()

void Unit::SetCritterGUID ( ObjectGuid  guid)
inline

References Object::SetGuidValue(), and UNIT_FIELD_CRITTER.

Referenced by SetMinion().

◆ SetCurrentCastedSpell()

void Unit::SetCurrentCastedSpell ( Spell pSpell)
3918{
3919 ASSERT(pSpell); // nullptr may be never passed here, use InterruptSpell or InterruptNonMeleeSpells
3920
3921 CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer();
3922
3923 if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self
3924 return;
3925
3926 bool bySelf = m_currentSpells[CSpellType] && m_currentSpells[CSpellType]->m_spellInfo->Id == pSpell->m_spellInfo->Id;
3927
3928 // break same type spell if it is not delayed
3929 InterruptSpell(CSpellType, false, true, bySelf);
3930
3931 // special breakage effects:
3932 switch (CSpellType)
3933 {
3935 {
3936 // generic spells always break channeled not delayed spells
3938 {
3939 if (!s->GetSpellInfo()->IsActionAllowedChannel())
3940 {
3942 }
3943 }
3944
3945 // autorepeat breaking
3947 {
3948 // break autorepeat if not Auto Shot
3949 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
3951 m_AutoRepeatFirstCast = true;
3952 }
3953
3954 // melee spells breaking
3956 {
3957 // break melee spells if cast time
3958 if (pSpell->GetCastTime() > 0)
3959 {
3961 }
3962 }
3963 if (pSpell->GetCastTime() > 0)
3965
3966 break;
3967 }
3969 {
3970 // channel spells always break generic non-delayed and any channeled spells
3972 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
3973
3974 // it also does break autorepeat if not Auto Shot
3976 m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
3979
3980 break;
3981 }
3983 {
3984 // only Auto Shoot does not break anything
3985 if (pSpell->m_spellInfo->Id != 75)
3986 {
3987 // generic autorepeats break generic non-delayed and channeled non-delayed spells
3989 {
3990 if (!s->GetSpellInfo()->IsActionAllowedChannel())
3991 {
3993 }
3994 }
3995
3997 }
3998 // special action: set first cast flag
3999 m_AutoRepeatFirstCast = true;
4000
4001 break;
4002 }
4003
4004 default:
4005 // other spell types don't break anything now
4006 break;
4007 }
4008
4009 // current spell (if it is still here) may be safely deleted now
4010 if (m_currentSpells[CSpellType])
4011 m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
4012
4013 // set new current spell
4014 m_currentSpells[CSpellType] = pSpell;
4015 pSpell->SetReferencedFromCurrent(true);
4016
4017 pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]);
4018}
CurrentSpellTypes GetCurrentContainer() const
Definition: Spell.cpp:7901
Spell ** m_selfContainer
Definition: Spell.h:610

References AddUnitState(), ASSERT, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Spell::GetCastTime(), Spell::GetCurrentContainer(), GetCurrentSpell(), SpellInfo::Id, InterruptSpell(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_selfContainer, Spell::m_spellInfo, Spell::SetReferencedFromCurrent(), and UNIT_STATE_CASTING.

Referenced by Spell::prepare().

◆ setDeathState()

void Unit::setDeathState ( DeathState  s,
bool  despawn = false 
)
virtual

Reimplemented in Creature, Minion, Pet, and Player.

14466{
14467 // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
14468 // it can be used to check creation of death items (such as soul shards).
14469
14470 if (s != DeathState::Alive && s != DeathState::JustRespawned)
14471 {
14472 CombatStop();
14475 ClearComboPointHolders(); // any combo points pointed to unit lost at it death
14476
14477 if (IsNonMeleeSpellCast(false))
14479
14480 UnsummonAllTotems(true);
14481 RemoveAllControlled(true);
14483 }
14484
14485 if (s == DeathState::JustDied)
14486 {
14487 // remove aurastates allowing special moves
14490
14491 GetMotionMaster()->Clear(false);
14493
14494 // Xinef: Remove Hover so the corpse can fall to the ground
14495 SetHover(false);
14496
14497 if (despawn)
14498 DisableSpline();
14499 else
14500 StopMoving();
14501
14502 // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
14503 // do not why since in IncreaseMaxHealth currenthealth is checked
14504 SetHealth(0);
14505 SetPower(getPowerType(), 0);
14506
14507 // Stop emote on death
14509
14510 // players in instance don't have ZoneScript, but they have InstanceScript
14512 zoneScript->OnUnitDeath(this);
14513 }
14514 else if (s == DeathState::JustRespawned)
14515 {
14516 RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
14517 }
14518
14519 m_deathState = s;
14520}
@ UNIT_FLAG_SKINNABLE
Definition: UnitDefines.h:255
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1192
ZoneScript * GetZoneScript() const
Definition: Object.h:535
void ClearAllReactives()
Definition: Unit.cpp:16841
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition: Unit.cpp:20552
void ClearDiminishings()
Definition: Unit.h:672
Definition: ZoneScript.h:27

References MotionMaster::Clear(), ClearAllReactives(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearDiminishings(), CombatStop(), HostileRefMgr::deleteReferences(), DisableSpline(), getHostileRefMgr(), WorldObject::GetInstanceScript(), GetMotionMaster(), getPowerType(), GetThreatMgr(), WorldObject::GetZoneScript(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), m_deathState, MotionMaster::MoveIdle(), RemoveAllAurasOnDeath(), RemoveAllControlled(), Object::RemoveFlag(), SetHealth(), SetHover(), SetPower(), SetUInt32Value(), StopMoving(), UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE, UNIT_NPC_EMOTESTATE, and UnsummonAllTotems().

Referenced by _ExitVehicle(), KillMagnetEvent::Execute(), Spell::finish(), WorldSession::HandlePetActionHelper(), AuraEffect::HandleSpiritOfRedemption(), Kill(), Creature::setDeathState(), and Player::setDeathState().

◆ SetDisableGravity()

◆ SetDisplayId()

◆ SetExtraUnitMovementFlags()

void Unit::SetExtraUnitMovementFlags ( uint16  f)
inline

◆ SetFacingTo()

void Unit::SetFacingTo ( float  ori)
20417{
20418 Movement::MoveSplineInit init(this);
20419 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
20421 init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
20422 init.SetFacing(ori);
20423 init.Launch();
20424}
ObjectGuid GetTransGUID() const override
Definition: Unit.cpp:18659

References Movement::MoveSplineInit::DisableTransportPathTransformations(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTransGUID(), HasUnitMovementFlag(), Movement::MoveSplineInit::Launch(), MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_twinemperorsAI::DoAction(), npc_arthas::npc_arthasAI::DoAction(), Spell::EffectDistract(), UtherBatteredHiltEvent::Execute(), DistractMovementGenerator::Finalize(), Creature::FocusTarget(), spell_item_unusual_compass::HandleDummy(), spell_drakkari_colossus_face_me::HandleScriptEffect(), boss_grand_warlock_nethekurse::IntroRP(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::JustDied(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::JustSummoned(), boss_nalorakk::MoveInLineOfSight(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::MovementInform(), boss_onyxia::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_eadric::boss_eadricAI::MovementInform(), boss_paletress::boss_paletressAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::MovementInform(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::MovementInform(), boss_illidan_stormrage::boss_illidan_stormrageAI::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), boss_felmyst::boss_felmystAI::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), spell_lurker_below_spout::OnPeriodic(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), SmartAI::PausePath(), SmartScript::ProcessAction(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_nightbane::ScheduleFly(), Player::SetClientControl(), boss_grand_warlock_nethekurse::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_chesspiece::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), CreatureAI::TriggerAlert(), RotateMovementGenerator::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), boss_onyxia::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_general_andorov::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_akama_illidan::npc_akama_illidanAI::UpdateEscortAI(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), npc_argent_soldier::npc_argent_soldierAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetFacingToObject()

void Unit::SetFacingToObject ( WorldObject object)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20427{
20428 // never face when already moving
20429 if (!IsStopped())
20430 return;
20431
20433 Movement::MoveSplineInit init(this);
20434 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20435 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20436 init.Launch();
20437}
bool IsStopped() const
Definition: Unit.h:1608

References Position::GetAngle(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), npc_ranshalla::npc_ranshallaAI::DoChannelTorchSpell(), spell_yogg_saron_target_selectors::HandleScript(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_illidan_stormrage::boss_illidan_stormrageAI::JustSummoned(), npc_drakuru_shackles::npc_drakuru_shacklesAI::LockRageclaw(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_nightbane::ScheduleFly(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), boss_the_lurker_below::SchedulerPhaseOne(), boss_shade_of_aran::SetGUID(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::SetGUID(), npc_harrison_jones::npc_harrison_jonesAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_forest_frog::npc_forest_frogAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_magister_aledis::StartFight(), boss_hydross_the_unstable::SummonMovementInform(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_pilgrims_bounty_chair::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_hidden_cultist::npc_hidden_cultistAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI(), npc_ranshalla::npc_ranshallaAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), npc_scarlet_miner::npc_scarlet_minerAI::WaypointReached(), and npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached().

◆ SetFaction()

void Unit::SetFaction ( uint32  faction)
9992{
9994 if (GetTypeId() == TYPEID_UNIT)
9996}
void UpdateMoveInLineOfSightState()
Definition: Creature.cpp:2572

References Object::GetTypeId(), SetUInt32Value(), Object::ToCreature(), TYPEID_UNIT, UNIT_FIELD_FACTIONTEMPLATE, and Creature::UpdateMoveInLineOfSightState().

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), npc_hidden_cultist::npc_hidden_cultistAI::AttackPlayer(), GameObject::CastSpell(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSummonType(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), AuraEffect::HandleAuraModFaction(), BattlegroundIC::HandleCapturedNodes(), spell_q12096_q12092_dummy::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFactionIdCommand(), npc_commandscript::HandleNpcSetFactionTempIdCommand(), spell_mutate_explode_bug::HandleOnHit(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_item_draenic_pale_ale::HandleSummon(), npc_cork_gizelton::npc_cork_gizeltonAI::ImmuneFlagSet(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_general_andorov::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), Minion::InitStats(), TempSummon::InitStats(), InitTamedPet(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), FollowerAI::JustRespawned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_volkhan::boss_volkhanAI::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_balinda::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), Pet::LoadPetFromDB(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), boss_twilight_corrupter::MoveInLineOfSight(), npc_akama_shade::MovementInform(), BattlegroundAB::NodeOccupied(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), spell_brewfest_reveler_transform::OnApply(), npc_chesspiece::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_nexus::instance_nexus_InstanceMapScript::OnCreatureCreate(), instance_black_temple::instance_black_temple_InstanceMapScript::OnCreatureCreate(), boss_azuregos::OnGossipSelect(), npc_prospector_remtravel::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_lakota_windsong::OnQuestAccept(), npc_paoka_swiftmountain::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_maxx_a_million_escort::OnQuestAccept(), npc_calvin_montague::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), npc_wizzlecrank_shredder::OnQuestAccept(), npc_ame::OnQuestAccept(), npc_ranshalla::OnQuestAccept(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), npc_bessy::OnQuestAccept(), npc_isla_starmane::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), BattlegroundAV::PopulateNode(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), RemoveCharmedBy(), boss_doomrel::boss_doomrelAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_coren_direbrew::Reset(), npc_direbrew_minion::Reset(), npc_aquementas::npc_aquementasAI::Reset(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), npc_captured_rageclaw::npc_captured_rageclawAI::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), RestoreFaction(), SetCharmedBy(), Player::SetFactionForRace(), Player::SetGameMaster(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), BattlegroundIC::SetupBattleground(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::SpawnCreature(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_crusade_persuaded::npc_crusade_persuadedAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::sQuestAccept(), npc_ranger_lilatha::sQuestAccept(), npc_corporal_keeshan::npc_corporal_keeshanAI::sQuestAccept(), npc_muglash::npc_muglashAI::sQuestAccept(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::sQuestAccept(), FollowerAI::StartFollow(), pyrewood_ambush::pyrewood_ambushAI::SummonCreatureWithRandomTarget(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), Spell::SummonGuardian(), Player::SummonPet(), npc_artruis_the_hearthless::npc_artruis_the_hearthlessAI::SummonsAction(), WorldObject::SummonTrigger(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_sergeant_bly::npc_sergeant_blyAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_magister_aledis::UpdateAI(), npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI::UpdateAI(), Creature::UpdateEntry(), npc_magwin::npc_magwinAI::UpdateEscortAI(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ SetFeared()

void Unit::SetFeared ( bool  apply,
Unit fearedBy = nullptr,
bool  isFear = false 
)
protected
18190{
18191 if (apply)
18192 {
18193 SetTarget();
18194 GetMotionMaster()->MoveFleeing(fearedBy, isFear ? 0 : sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY));
18195 }
18196 else
18197 {
18198 if (IsAlive())
18199 {
18200 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == FLEEING_MOTION_TYPE)
18201 {
18203 StopMoving();
18204 }
18205
18206 if (GetVictim())
18208 }
18209 }
18210
18211 // xinef: block / allow control to real mover (eg. charmer)
18212 if (IsPlayer())
18213 {
18214 if (m_movedByPlayer)
18215 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18216 //else
18217 // ToPlayer()->SetClientControl(this, !apply);
18218 }
18219}
@ FLEEING_MOTION_TYPE
Definition: MotionMaster.h:47
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition: IWorld.h:289
void MoveFleeing(Unit *enemy, uint32 time=0)
Definition: MotionMaster.cpp:699

References CONFIG_CREATURE_FAMILY_FLEE_DELAY, FLEEING_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveFleeing(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), sWorld, and Object::ToPlayer().

Referenced by SetControlled().

◆ SetFeatherFall()

bool Unit::SetFeatherFall ( bool  enable,
bool  packetOnly = false 
)
virtual

Reimplemented in Player, and Creature.

20531{
20533 return false;
20534
20535 if (enable)
20537 else
20539
20540 return true;
20541}
@ MOVEMENTFLAG_FALLING_SLOW
Definition: UnitDefines.h:373

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_FALLING_SLOW, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraFeatherFall(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetFeatherFall(), and Creature::SetFeatherFall().

◆ SetFullHealth()

◆ SetHealth()

void Unit::SetHealth ( uint32  val)
15392{
15393 if (getDeathState() == DeathState::JustDied)
15394 val = 0;
15395 else if (IsPlayer() && getDeathState() == DeathState::Dead)
15396 val = 1;
15397 else
15398 {
15399 uint32 maxHealth = GetMaxHealth();
15400 if (maxHealth < val)
15401 val = maxHealth;
15402 }
15403
15404 float prevHealthPct = GetHealthPct();
15405
15407
15408 // mobs that are now or were below 30% need to update their speed
15409 if (GetTypeId() == TYPEID_UNIT && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
15410 {
15411 UpdateSpeed(MOVE_RUN, false);
15412 }
15413
15414 // group update
15415 if (IsPlayer())
15416 {
15417 Player* player = ToPlayer();
15418 if (player->NeedSendSpectatorData())
15420
15421 if (player->GetGroup())
15423 }
15424 else if (Pet* pet = ToCreature()->ToPet())
15425 {
15426 if (pet->isControlled())
15427 {
15428 if (Unit* owner = GetOwner())
15429 if (Player* player = owner->ToPlayer())
15430 {
15431 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15432 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15433
15434 if (player->GetGroup())
15436 }
15437 }
15438 }
15439}
@ GROUP_UPDATE_FLAG_CUR_HP
Definition: Group.h:101
@ GROUP_UPDATE_FLAG_PET_CUR_HP
Definition: Group.h:113
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition: ArenaSpectator.h:62
bool NeedSendSpectatorData() const
Definition: Player.cpp:15349
void SetGroupUpdateFlag(uint32 flag)
Definition: Player.h:2450
float GetHealthPct() const
Definition: Unit.h:789

References WorldObject::FindMap(), getDeathState(), Player::GetGroup(), Object::GetGUID(), GetHealthPct(), GetMaxHealth(), GetOwner(), Object::GetTypeId(), GROUP_UPDATE_FLAG_CUR_HP, GROUP_UPDATE_FLAG_PET_CUR_HP, HealthBelowPct(), IsControlledByPlayer(), IsPet(), Object::IsPlayer(), MOVE_RUN, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), TYPEID_UNIT, UNIT_FIELD_HEALTH, and UpdateSpeed().

Referenced by boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), Player::BuildPlayerRepop(), npc_mograine::npc_mograineAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Spell::EffectSummonType(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), boss_halazzi::EnterPhase(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_oculus_soar_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyHPCommand(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcSetLevelCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), npc_echo_of_medivh::HandlePieceJustDied(), spell_stinky_precious_decimate::HandleScript(), spell_ahune_synch_health::HandleScript(), AuraEffect::HandleSpiritOfRedemption(), npc_pet_pri_lightwell::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustReachedHome(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustReachedHome(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_nether_drake::npc_nether_drakeAI::MovementInform(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Player::ProcessDelayedOperations(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_kalecgos::boss_kalecgosAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetAllPowers(), Player::RestoreHealthAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetFullHealth(), SetMaxHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ SetHover()

bool Unit::SetHover ( bool  enable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
virtual

Reimplemented in Creature, and Player.

20553{
20555 return false;
20556
20557 float hoverHeight = GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
20558
20559 if (enable)
20560 {
20562 if (hoverHeight && GetPositionZ() - GetFloorZ() < hoverHeight)
20563 UpdateHeight(GetPositionZ() + hoverHeight);
20564 }
20565 else
20566 {
20568 if (hoverHeight && (!isDying() || GetTypeId() != TYPEID_UNIT))
20569 {
20570 float newZ = std::max<float>(GetFloorZ(), GetPositionZ() - hoverHeight);
20572 UpdateHeight(newZ);
20573 }
20574 SendMovementFlagUpdate(); // pussywizard: needed for falling after death (instead of falling onto air at hover height)
20575 }
20576
20577 return true;
20578}
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition: Object.cpp:1554
float GetFloorZ() const
Definition: Object.cpp:3130
void UpdateHeight(float newZ)
Only server-side height update, does not broadcast to client.
Definition: Unit.cpp:19976
void SendMovementFlagUpdate(bool self=false)
Definition: Unit.cpp:16618

References AddUnitMovementFlag(), Object::GetFloatValue(), WorldObject::GetFloorZ(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::GetTypeId(), HasUnitMovementFlag(), isDying(), MOVEMENTFLAG_HOVER, RemoveUnitMovementFlag(), SendMovementFlagUpdate(), TYPEID_UNIT, UNIT_FIELD_HOVERHEIGHT, WorldObject::UpdateAllowedPositionZ(), and UpdateHeight().

Referenced by AuraEffect::HandleAuraHover(), debug_commandscript::HandleDebugMoveflagsCommand(), setDeathState(), Creature::SetHover(), and Player::SetHover().

◆ SetImmuneToAll()

void Unit::SetImmuneToAll ( bool  apply,
bool  keepCombat = false 
)
inline
1021{ SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); }
void SetImmuneToNPC(bool apply, bool keepCombat=false)
Definition: Unit.cpp:13537

References SetImmuneToNPC(), and SetImmuneToPC().

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), boss_chromaggus::boss_chromaggusAI::boss_chromaggusAI(), boss_nalorakk::boss_nalorakk(), boss_felblood_kaelthas::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_broggok::DoAction(), boss_grand_warlock_nethekurse::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_ambassador_hellmaw::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), boss_skeram::DoTeleport(), Spell::EffectSummonType(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), spell_uldaman_stoned::spell_uldaman_stoned_AuraScript::HandleEffectApply(), spell_uldaman_stoned::spell_uldaman_stoned_AuraScript::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_item_draenic_pale_ale::HandleSummon(), boss_majordomo::boss_majordomoAI::InitializeAI(), boss_felblood_kaelthas::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_taldaram::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::InitializeAI(), Player::InitStatsForLevel(), boss_falric::boss_falricAI::JustEngagedWith(), boss_marwyn::boss_marwynAI::JustEngagedWith(), boss_moroes::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_rinji::npc_rinjiAI::JustRespawned(), npc_isla_starmane::npc_isla_starmaneAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_skeram::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), boss_captain_skarloc::MovementInform(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), npc_enslaved_proto_drake::npc_enslaved_proto_drakeAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_memory::npc_memoryAI::npc_memoryAI(), npc_rinji::npc_rinjiAI::npc_rinjiAI(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_felblood_kaelthas::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_skeram::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_marwyn::boss_marwynAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), boss_svala::boss_svalaAI::Reset(), npc_thassarian::npc_thassarianAI::Reset(), boss_ambassador_hellmaw::Reset(), boss_illidan_stormrage::boss_illidan_stormrageAI::Reset(), boss_broggok::Reset(), boss_grand_warlock_nethekurse::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_svala::boss_svalaAI::SetData(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_chromaggus::boss_chromaggusAI::SetGUID(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_rinji::npc_rinjiAI::sQuestAccept(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_felblood_kaelthas::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_skeram::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_anzu::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), and npc_franklin::npc_franklinAI::UpdateAI().

◆ SetImmuneToNPC()

void Unit::SetImmuneToNPC ( bool  apply,
bool  keepCombat = false 
)

◆ SetImmuneToPC()

void Unit::SetImmuneToPC ( bool  apply,
bool  keepCombat = false 
)
13529{
13530 (void)keepCombat;
13531 if (apply)
13533 else
13535}

References RemoveUnitFlag(), SetUnitFlag(), and UNIT_FLAG_IMMUNE_TO_PC.

Referenced by boss_victor_nefarius::boss_victor_nefariusAI::BeginEvent(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), ClearInCombat(), npc_magister_aledis::DamageTaken(), npc_calvin_montague::npc_calvin_montagueAI::DamageTaken(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove(), boss_blackheart_the_inciter::JustEngagedWith(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::JustSummoned(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), npc_omen::npc_omenAI::MovementInform(), npc_omen::npc_omenAI::npc_omenAI(), npc_death_knight_initiate::OnGossipSelect(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), npc_calvin_montague::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), boss_doomrel::boss_doomrelAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_julianne::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_a_special_surprise::npc_a_special_surpriseAI::Reset(), npc_calvin_montague::npc_calvin_montagueAI::Reset(), npc_coren_direbrew::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), boss_blackheart_the_inciter::Reset(), boss_magtheridon::Reset(), npc_magister_aledis::Reset(), boss_magtheridon::ScheduleCombatEvents(), SetImmuneToAll(), SetInCombatState(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_magister_aledis::UpdateAI(), and npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI().

◆ SetInCombatState()

void Unit::SetInCombatState ( bool  PvP,
Unit enemy = nullptr,
uint32  duration = 0 
)
13650{
13651 // only alive units can be in combat
13652 if (!IsAlive())
13653 return;
13654
13655 if (PvP)
13656 m_CombatTimer = std::max<uint32>(GetCombatTimer(), std::max<uint32>(5500, duration));
13657 else if (duration)
13658 m_CombatTimer = std::max<uint32>(GetCombatTimer(), duration);
13659
13661 return;
13662
13663 // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back
13665 SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back
13666
13667 if (IsInCombat())
13668 return;
13669
13671
13672 if (Creature* creature = ToCreature())
13673 {
13674 // Set home position at place of engaging combat for escorted creatures
13675 if ((IsAIEnabled && creature->AI()->IsEscorted()) ||
13676 GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE ||
13677 GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE)
13678 creature->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
13679
13680 if (enemy)
13681 {
13682 if (IsAIEnabled)
13683 creature->AI()->JustEngagedWith(enemy);
13684
13685 if (creature->GetFormation())
13686 creature->GetFormation()->MemberEngagingTarget(creature, enemy);
13687
13688 sScriptMgr->OnUnitEnterCombat(creature, enemy);
13689 }
13690
13691 creature->RefreshSwimmingFlag();
13692
13693 if (IsPet())
13694 {
13695 UpdateSpeed(MOVE_RUN, true);
13696 UpdateSpeed(MOVE_SWIM, true);
13697 UpdateSpeed(MOVE_FLIGHT, true);
13698 }
13699
13700 if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT))
13701 Dismount();
13702 if (!IsStandState()) // pussywizard: already done in CombatStart(target, initialAggro) for the target, but when aggro'ing from MoveInLOS CombatStart is not called!
13704 }
13705
13706 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
13707 {
13708 Unit* controlled = *itr;
13709 ++itr;
13710
13711 // Xinef: Dont set combat for passive units, they will evade in next update...
13712 if (controlled->GetTypeId() == TYPEID_UNIT && controlled->ToCreature()->HasReactState(REACT_PASSIVE))
13713 continue;
13714
13715 controlled->SetInCombatState(PvP, enemy, duration);
13716 }
13717
13718 if (Player* player = this->ToPlayer())
13719 {
13720 sScriptMgr->OnPlayerEnterCombat(player, enemy);
13721 }
13722}
@ MOVE_FLIGHT
Definition: UnitDefines.h:334
@ MOVE_SWIM
Definition: UnitDefines.h:331
@ ESCORT_MOTION_TYPE
Definition: MotionMaster.h:55
@ WAYPOINT_MOTION_TYPE
Definition: MotionMaster.h:39
@ CREATURE_TYPE_NON_COMBAT_PET
Definition: SharedDefines.h:2639
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
Definition: SharedDefines.h:2706
bool HasReactState(ReactStates state) const
Definition: Creature.h:93
uint32 GetCombatTimer() const
Definition: Unit.h:1041
void SetInCombatState(bool PvP, Unit *enemy=nullptr, uint32 duration=0)
Definition: Unit.cpp:13649
bool IsStandState() const
Definition: Unit.cpp:16634

References CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT, CREATURE_TYPE_NON_COMBAT_PET, Dismount(), ESCORT_MOTION_TYPE, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCombatTimer(), GetCreatureType(), GetMotionMaster(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::GetTypeId(), Creature::HasReactState(), HasUnitState(), IsAIEnabled, IsAlive(), IsImmuneToPC(), IsInCombat(), IsPet(), IsStandState(), m_CombatTimer, m_Controlled, MOVE_FLIGHT, MOVE_RUN, MOVE_SWIM, REACT_PASSIVE, SetImmuneToPC(), SetInCombatState(), SetStandState(), SetUnitFlag(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), TYPEID_UNIT, UNIT_FLAG_IN_COMBAT, UNIT_STAND_STATE_STAND, UNIT_STATE_EVADE, UpdateSpeed(), and WAYPOINT_MOTION_TYPE.

Referenced by Spell::DoSpellHitOnUnit(), SetInCombatState(), and SetInCombatWith().

◆ SetInCombatWith()

void Unit::SetInCombatWith ( Unit enemy,
uint32  duration = 0 
)
13503{
13504 // Xinef: Dont allow to start combat with triggers
13505 if (enemy->GetTypeId() == TYPEID_UNIT && enemy->ToCreature()->IsTrigger())
13506 return;
13507
13508 Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
13509 if (eOwner->IsPvP() || eOwner->IsFFAPvP())
13510 {
13511 SetInCombatState(true, enemy, duration);
13512 return;
13513 }
13514
13515 // check for duel
13516 if (eOwner->IsPlayer() && eOwner->ToPlayer()->duel)
13517 {
13518 Unit const* myOwner = GetCharmerOrOwnerOrSelf();
13519 if (((Player const*)eOwner)->duel->Opponent == myOwner)
13520 {
13521 SetInCombatState(true, enemy, duration);
13522 return;
13523 }
13524 }
13525 SetInCombatState(false, enemy, duration);
13526}

References Player::duel, GetCharmerOrOwnerOrSelf(), Object::GetTypeId(), IsFFAPvP(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), SetInCombatState(), Object::ToCreature(), Object::ToPlayer(), and TYPEID_UNIT.

Referenced by Attack(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), CombatStart(), CombatStartOnCast(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), Spell::DoAllEffectOnTarget(), CreatureAI::DoZoneInCombat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), spell_herald_volzaj_insanity::HandleDummyEffect(), boss_chromaggus::boss_chromaggusAI::PathEndReached(), SmartScript::ProcessAction(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), and npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI().

◆ SetInFront()

◆ SetInstantCast()

void Unit::SetInstantCast ( bool  set)
inline
1778{ _instantCast = set; }

References _instantCast.

Referenced by AuraEffect::HandleModCastingSpeed().

◆ SetLastDamagedTargetGuid()

void Unit::SetLastDamagedTargetGuid ( ObjectGuid const &  guid)
inline

◆ SetLastExtraAttackSpell()

void Unit::SetLastExtraAttackSpell ( uint32  spellId)
inline
913{ _lastExtraAttackSpell = spellId; }

References _lastExtraAttackSpell.

Referenced by Spell::_handle_finish_phase().

◆ SetLastManaUse()

void Unit::SetLastManaUse ( uint32  spellCastTime)
inline
1559{ m_lastManaUse = spellCastTime; }

References m_lastManaUse.

Referenced by Spell::TakePower().

◆ SetLevel()

void Unit::SetLevel ( uint8  lvl,
bool  showLevelChange = true 
)

◆ SetMaxHealth()

void Unit::SetMaxHealth ( uint32  val)
15442{
15443 if (!val)
15444 val = 1;
15445
15446 uint32 health = GetHealth();
15448
15449 // group update
15450 if (IsPlayer())
15451 {
15452 Player* player = ToPlayer();
15453 if (player->NeedSendSpectatorData())
15455
15456 if (player->GetGroup())
15458 }
15459 else if (Pet* pet = ToCreature()->ToPet())
15460 {
15461 if (pet->isControlled())
15462 {
15463 if (Unit* owner = GetOwner())
15464 if (Player* player = owner->ToPlayer())
15465 {
15466 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15467 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15468
15469 if (player->GetGroup())
15471 }
15472 }
15473 }
15474
15475 if (val < health)
15476 SetHealth(val);
15477}
@ GROUP_UPDATE_FLAG_MAX_HP
Definition: Group.h:102
@ GROUP_UPDATE_FLAG_PET_MAX_HP
Definition: Group.h:114

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetHealth(), GetOwner(), GROUP_UPDATE_FLAG_MAX_HP, GROUP_UPDATE_FLAG_PET_MAX_HP, Object::IsPlayer(), Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetHealth(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXHEALTH.

Referenced by boss_xt002::boss_xt002AI::DoAction(), Spell::EffectSummonType(), boss_halazzi::EnterPhase(), modify_commandscript::HandleModifyHPCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_pet_pri_lightwell::InitializeAI(), Player::InitStatsForLevel(), boss_skeram::JustSummoned(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), Creature::SelectLevel(), boss_akilzon::boss_akilzonAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), Creature::UpdateMaxHealth(), Guardian::UpdateMaxHealth(), and Player::UpdateMaxHealth().

◆ SetMaxPower()

void Unit::SetMaxPower ( Powers  power,
uint32  val 
)
15545{
15546 uint32 cur_power = GetPower(power);
15547 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power, val);
15548
15549 // group update
15550 if (IsPlayer())
15551 {
15552 Player* player = ToPlayer();
15553 if (getPowerType() == power && player->NeedSendSpectatorData())
15554 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15555
15556 if (player->GetGroup())
15558 }
15559 else if (Pet* pet = ToCreature()->ToPet())
15560 {
15561 if (pet->isControlled())
15562 {
15563 Unit* owner = GetOwner();
15564 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15566 }
15567 }
15568
15569 if (val < cur_power)
15570 SetPower(power, val);
15571}
@ GROUP_UPDATE_FLAG_PET_MAX_POWER
Definition: Group.h:117
@ GROUP_UPDATE_FLAG_MAX_POWER
Definition: Group.h:105
void SetStatInt32Value(uint16 index, int32 value)
Definition: Object.cpp:798

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetOwner(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_MAX_POWER, GROUP_UPDATE_FLAG_PET_MAX_POWER, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetPower(), Object::SetStatInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::Create(), Pet::CreateBaseAtTamed(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), Creature::SelectLevel(), setPowerType(), Creature::UpdateMaxPower(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ SetMinion()

void Unit::SetMinion ( Minion minion,
bool  apply 
)
10607{
10608 LOG_DEBUG("entities.unit", "SetMinion {} for {}, apply {}", minion->GetEntry(), GetEntry(), apply);
10609
10610 if (apply)
10611 {
10612 if (minion->GetOwnerGUID())
10613 {
10614 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10615 return;
10616 }
10617
10618 minion->SetOwnerGUID(GetGUID());
10619
10620 m_Controlled.insert(minion);
10621
10622 if (IsPlayer())
10623 {
10624 minion->m_ControlledByPlayer = true;
10626 }
10627
10628 // Can only have one pet. If a new one is summoned, dismiss the old one.
10629 if (minion->IsGuardianPet())
10630 {
10631 if (Guardian* oldPet = GetGuardianPet())
10632 {
10633 if (oldPet != minion && (oldPet->IsPet() || minion->IsPet() || oldPet->GetEntry() != minion->GetEntry()))
10634 {
10635 // remove existing minion pet
10636 if (Pet* oldPetAsPet = oldPet->ToPet())
10637 {
10638 oldPetAsPet->Remove(PET_SAVE_NOT_IN_SLOT);
10639 }
10640 else
10641 {
10642 oldPet->UnSummon();
10643 }
10644
10645 SetPetGUID(minion->GetGUID());
10647 }
10648 }
10649 else
10650 {
10651 SetPetGUID(minion->GetGUID());
10653 }
10654 }
10655
10657 {
10659 }
10660
10661 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10662 {
10663 SetCritterGUID(minion->GetGUID());
10664 }
10665
10666 // PvP, FFAPvP
10668
10669 // Ghoul pets have energy instead of mana (is anywhere better place for this code?)
10670 if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
10671 minion->setPowerType(POWER_ENERGY);
10672
10673 if (IsPlayer())
10674 {
10675 // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
10676 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10677
10678 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10679 ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, nullptr, true);
10680 }
10681 }
10682 else
10683 {
10684 if (minion->GetOwnerGUID() != GetGUID())
10685 {
10686 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10687 return;
10688 }
10689
10690 m_Controlled.erase(minion);
10691
10692 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10693 {
10694 if (GetCritterGUID() == minion->GetGUID())
10696 }
10697
10698 if (minion->IsGuardianPet())
10699 {
10700 if (GetPetGUID() == minion->GetGUID())
10702 }
10703 else if (minion->IsTotem())
10704 {
10705 // All summoned by totem minions must disappear when it is removed.
10706 if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell()))
10707 {
10708 for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
10709 {
10710 if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON)
10711 continue;
10712
10713 RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue);
10714 }
10715 }
10716 }
10717
10718 if (IsPlayer())
10719 {
10720 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10721 // Remove infinity cooldown
10722 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10723 ToPlayer()->SendCooldownEvent(spellInfo);
10724
10725 // xinef: clear spell book
10726 if (m_Controlled.empty())
10728 }
10729
10730 //if (minion->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10731 {
10733 {
10734 // Check if there is another minion
10735 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10736 {
10737 // do not use this check, creature do not have charm guid
10738 //if (GetCharmGUID() == (*itr)->GetGUID())
10739 if (GetGUID() == (*itr)->GetCharmerGUID())
10740 continue;
10741
10742 //ASSERT((*itr)->GetOwnerGUID() == GetGUID());
10743 if ((*itr)->GetOwnerGUID() != GetGUID())
10744 {
10745 OutDebugInfo();
10746 (*itr)->OutDebugInfo();
10747 ABORT();
10748 }
10749 ASSERT((*itr)->GetTypeId() == TYPEID_UNIT);
10750
10751 if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN))
10752 continue;
10753
10754 if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID()))
10755 {
10756 // show another pet bar if there is no charm bar
10757 if (IsPlayer() && !GetCharmGUID())
10758 {
10759 if ((*itr)->IsPet())
10761 else
10763 }
10764 }
10765 break;
10766 }
10767 }
10768 }
10769 }
10770}
@ PET_SAVE_NOT_IN_SLOT
Definition: PetDefines.h:45
@ SPELL_EFFECT_SUMMON
Definition: SharedDefines.h:806
@ SUMMON_TYPE_MINIPET
Definition: SharedDefines.h:3299
const SummonPropertiesEntry *const m_Properties
Definition: TemporarySummon.h:63
bool IsGuardianPet() const
Definition: TemporarySummon.cpp:390
bool IsPetGhoul() const
Definition: TemporarySummon.h:84
void PetSpellInitialize()
Definition: Player.cpp:9424
uint32 GetSpell(uint8 slot=0) const
Definition: Totem.h:59
void OutDebugInfo() const
Definition: Unit.cpp:20137
ObjectGuid GetCritterGUID() const
Definition: Unit.h:1168
void SetOwnerGUID(ObjectGuid owner)
Definition: Unit.cpp:10499
void SetCritterGUID(ObjectGuid guid)
Definition: Unit.h:1167
void setPowerType(Powers power)
Definition: Unit.cpp:9914
void RemoveAllMinionsByEntry(uint32 entry)
Definition: Unit.cpp:10784
uint32 Type
Definition: DBCStructure.h:1913

References ABORT, Object::AddGuidValue(), Player::AddSpellAndCategoryCooldowns(), ASSERT, Player::CharmSpellInitialize(), ObjectGuid::Empty, Object::GetByteValue(), GetCharmGUID(), GetCritterGUID(), Object::GetEntry(), GetGuardianPet(), Object::GetGUID(), GetOwnerGUID(), GetPetGUID(), Totem::GetSpell(), Object::GetUInt32Value(), HasUnitTypeMask(), SpellInfo::IsCooldownStartedOnEvent(), Minion::IsGuardianPet(), IsPet(), Minion::IsPetGhoul(), Object::IsPlayer(), IsTotem(), LOG_DEBUG, LOG_FATAL, m_Controlled, m_ControlledByPlayer, TempSummon::m_Properties, MAX_SPELL_EFFECTS, OutDebugInfo(), PET_SAVE_NOT_IN_SLOT, Player::PetSpellInitialize(), POWER_ENERGY, RemoveAllMinionsByEntry(), Object::RemoveGuidValue(), Player::SendCooldownEvent(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCritterGUID(), SetMinionGUID(), SetOwnerGUID(), SetPetGUID(), setPowerType(), SetUnitFlag(), SPELL_EFFECT_SUMMON, sSpellMgr, SUMMON_TYPE_MINIPET, ToPet(), Object::ToPlayer(), ToTotem(), SummonPropertiesEntry::Type, TYPEID_UNIT, UNIT_CREATED_BY_SPELL, UNIT_FIELD_BYTES_2, UNIT_FIELD_SUMMON, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_CONTROLABLE_GUARDIAN.

Referenced by Player::CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectTameCreature(), Pet::LoadPetFromDB(), Player::RemovePet(), and Player::SummonPet().

◆ SetMinionGUID()

void Unit::SetMinionGUID ( ObjectGuid  guid)
inline

◆ SetModelVisible()

◆ SetModifierValue()

◆ SetNativeDisplayId()

◆ SetNpcFlag()

void Unit::SetNpcFlag ( NPCFlags  flags)
inline
991{ SetFlag(UNIT_NPC_FLAGS, flags); }

References Object::SetFlag(), and UNIT_NPC_FLAGS.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::InitializeAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::JustReachedHome(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_fairbanks::npc_fairbanksAI::MoveInLineOfSight(), npc_chesspiece::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_pos_leader_second::npc_pos_leader_secondAI::MovementInform(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::MovementInform(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::MovementInform(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_akama_illidan::npc_akama_illidanAI::PathEndReached(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), Vehicle::RemovePassenger(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_hyjal_jaina::hyjalJainaAI::Reset(), npc_hyjal_thrall::hyjalThrallAI::Reset(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::Reset(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_akama_illidan::npc_akama_illidanAI::Reset(), npc_akama_shade::Reset(), npc_magister_aledis::Reset(), Vehicle::Reset(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::ResetData(), NPCStaveQuestAI::ResetState(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_arthas::npc_arthasAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_general_andorov::WaypointReached(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ SetOwnerGUID()

void Unit::SetOwnerGUID ( ObjectGuid  owner)
10500{
10501 if (GetOwnerGUID() == owner)
10502 return;
10503
10505 if (!owner)
10506 return;
10507
10508 m_applyResilience = !IsVehicle() && owner.IsPlayer();
10509
10510 // Update owner dependent fields
10511 Player* player = ObjectAccessor::GetPlayer(*this, owner);
10512 if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
10513 return;
10514
10516
10517 UpdateData udata;
10518 WorldPacket packet;
10519 BuildValuesUpdateBlockForPlayer(&udata, player);
10520 udata.BuildPacket(packet);
10521 player->SendDirectMessage(&packet);
10522
10524}
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition: Object.cpp:257
void RemoveFieldNotifyFlag(uint16 flag)
Definition: Object.h:192
void SetFieldNotifyFlag(uint16 flag)
Definition: Object.h:191
Definition: UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition: UpdateData.cpp:48
bool HaveAtClient(WorldObject const *u) const
Definition: Player.cpp:11364

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), GetOwnerGUID(), ObjectAccessor::GetPlayer(), Player::HaveAtClient(), ObjectGuid::IsPlayer(), IsVehicle(), m_applyResilience, Object::RemoveFieldNotifyFlag(), Player::SendDirectMessage(), Object::SetFieldNotifyFlag(), Object::SetGuidValue(), UF_FLAG_OWNER, and UNIT_FIELD_SUMMONEDBY.

Referenced by GameObject::CastSpell(), Spell::EffectSummonType(), boss_illidari_council_memberAI::EnterEvadeMode(), spell_item_draenic_pale_ale::HandleSummon(), npc_pet_gen_fetch_ball::IsSummonedBy(), boss_razorgore::boss_razorgoreAI::JustSummoned(), Player::LoadFromDB(), SetMinion(), and npc_grimstone::npc_grimstoneAI::UpdateEscortAI().

◆ SetPetGUID()

◆ SetPhaseMask()

void Unit::SetPhaseMask ( uint32  newPhaseMask,
bool  update 
)
overridevirtual

Reimplemented from WorldObject.

18953{
18954 if (newPhaseMask == GetPhaseMask())
18955 return;
18956
18957 if (IsInWorld())
18958 {
18959 // xinef: to comment, bellow line should be removed
18960 // pussywizard: goign to other phase (valithria, algalon) should not remove such auras
18961 //RemoveNotOwnSingleTargetAuras(newPhaseMask, true); // we can lost access to caster or target
18962
18963 if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
18964 return;
18965
18966 // modify hostile references for new phasemask, some special cases deal with hostile references themselves
18967 if (GetTypeId() == TYPEID_UNIT || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
18968 {
18969 HostileRefMgr& refMgr = getHostileRefMgr();
18970 HostileReference* ref = refMgr.getFirst();
18971
18972 while (ref)
18973 {
18974 if (Unit* unit = ref->GetSource()->GetOwner())
18975 if (Creature* creature = unit->ToCreature())
18976 refMgr.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
18977
18978 ref = ref->next();
18979 }
18980
18981 // modify threat lists for new phasemask
18982 if (GetTypeId() != TYPEID_PLAYER)
18983 {
18986
18987 // merge expects sorted lists
18988 threatList.sort();
18989 offlineThreatList.sort();
18990 threatList.merge(offlineThreatList);
18991
18992 for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
18993 if (Unit* unit = (*itr)->getTarget())
18994 unit->getHostileRefMgr().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
18995 }
18996 }
18997 }
18998
18999 WorldObject::SetPhaseMask(newPhaseMask, false);
19000
19001 if (!IsInWorld())
19002 {
19003 return;
19004 }
19005
19006 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
19007 {
19008 Unit* controlled = *itr;
19009 ++itr;
19010 if (controlled->GetTypeId() == TYPEID_UNIT)
19011 {
19012 controlled->SetPhaseMask(newPhaseMask, true);
19013 }
19014 }
19015
19016 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
19017 {
19018 if (m_SummonSlot[i])
19019 {
19020 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
19021 {
19022 summon->SetPhaseMask(newPhaseMask, true);
19023 }
19024 }
19025 }
19026
19027 if (update)
19028 {
19030 }
19031}
FROM * GetSource() const
Definition: Reference.h:97
Definition: HostileRefMgr.h:32
void setOnlineOfflineState(bool isOnline)
Definition: HostileRefMgr.cpp:98
HostileReference * getFirst()
Definition: HostileRefMgr.h:60
HostileReference * next()
Definition: ThreatMgr.h:116
ThreatContainer::StorageType const & GetOfflineThreatList() const
Definition: ThreatMgr.h:275
Unit * GetOwner() const
Definition: ThreatMgr.h:237
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition: Object.cpp:2870
uint32 GetPhaseMask() const
Definition: Object.h:444
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition: Unit.cpp:18952

References HostileRefMgr::getFirst(), getHostileRefMgr(), WorldObject::GetMap(), ThreatMgr::GetOfflineThreatList(), ThreatMgr::GetOwner(), WorldObject::GetPhaseMask(), Reference< TO, FROM >::GetSource(), ThreatMgr::GetThreatList(), GetThreatMgr(), Object::GetTypeId(), WorldObject::InSamePhase(), Object::IsInWorld(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, HostileReference::next(), HostileRefMgr::setOnlineOfflineState(), WorldObject::SetPhaseMask(), SetPhaseMask(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, and UpdateObjectVisibility().

Referenced by Pet::Create(), Creature::Create(), misc_commandscript::HandleAppearCommand(), modify_commandscript::HandleModifyPhaseCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), spell_wintergrasp_hide_small_elementals_aura::HandlePeriodicDummy(), AuraEffect::HandlePhase(), Battlefield::HideNpc(), boss_volazj::InitializeAI(), boss_zuramat::boss_zuramatAI::JustSummoned(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::JustSummoned(), BattlegroundAB::RemovePlayer(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_twilight_halion::boss_twilight_halionAI::Reset(), Creature::setDeathState(), Player::SetGameMaster(), SetPhaseMask(), Battlefield::ShowNpc(), WorldObject::SummonTrigger(), and npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached().

◆ SetPower()

void Unit::SetPower ( Powers  power,
uint32  val,
bool  withPowerUpdate = true,
bool  fromRegenerate = false 
)
15480{
15481 if (!fromRegenerate && GetPower(power) == val)
15482 {
15483 return;
15484 }
15485
15486 uint32 maxPower = GetMaxPower(power);
15487 if (maxPower < val)
15488 {
15489 val = maxPower;
15490 }
15491
15492 if (fromRegenerate)
15493 {
15494 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, val);
15496 }
15497 else
15498 {
15499 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, val);
15500 }
15501
15502 if (withPowerUpdate)
15503 {
15505 data << GetPackGUID();
15506 data << uint8(power);
15507 data << uint32(val);
15508 SendMessageToSet(&data, IsPlayer());
15509 }
15510
15511 // group update
15512 if (IsPlayer())
15513 {
15514 Player* player = ToPlayer();
15515 if (getPowerType() == power && player->NeedSendSpectatorData())
15516 {
15517 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15518 }
15519
15520 if (player->GetGroup())
15521 {
15523 }
15524 }
15525 else if (Pet* pet = ToCreature()->ToPet())
15526 {
15527 if (pet->isControlled())
15528 {
15529 Unit* owner = GetOwner();
15530 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15531 {
15533 }
15534 }
15535
15536 // Update the pet's character sheet with happiness damage bonus
15537 if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
15538 {
15539 pet->UpdateDamagePhysical(BASE_ATTACK);
15540 }
15541 }
15542}
@ GROUP_UPDATE_FLAG_PET_CUR_POWER
Definition: Group.h:116
@ GROUP_UPDATE_FLAG_CUR_POWER
Definition: Group.h:104
@ SMSG_POWER_UPDATE
Definition: Opcodes.h:1182
void UpdateUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:663
void AddToObjectUpdateIfNeeded()
Definition: Object.cpp:524

References Object::AddToObjectUpdateIfNeeded(), BASE_ATTACK, WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), Object::GetPackGUID(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_CUR_POWER, GROUP_UPDATE_FLAG_PET_CUR_POWER, HUNTER_PET, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_HAPPINESS, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), WorldObject::SendMessageToSet(), Player::SetGroupUpdateFlag(), Object::SetStatInt32Value(), SMSG_POWER_UPDATE, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_POWER1, and Object::UpdateUInt32Value().

Referenced by Player::ActivateSpec(), Player::Create(), Pet::CreateBaseAtTamed(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), WorldSession::HandlePetAbandon(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), Player::ProcessDelayedOperations(), Player::Regenerate(), spell_igb_incinerating_blast::RemoveEnergy(), spell_igb_below_zero::RemovePassengers(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_selin_fireheart::Reset(), boss_moam::Reset(), npc_obsidian_destroyer::Reset(), npc_obsidian_eradicator::Reset(), npc_obsidian_nullifier::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::RestoreManaAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetMaxPower(), setPowerType(), Player::SummonPet(), and npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI().

◆ setPowerType()

void Unit::setPowerType ( Powers  power)
9915{
9916 SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
9917
9918 if (IsPlayer())
9919 {
9920 if (ToPlayer()->GetGroup())
9922 }
9923 else if (Pet* pet = ToCreature()->ToPet())
9924 {
9925 if (pet->isControlled())
9926 {
9927 Unit* owner = GetOwner();
9928 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
9930 }
9931 }
9932
9933 float powerMultiplier = 1.0f;
9934 if (!IsPet())
9935 if (Creature* creature = ToCreature())
9936 powerMultiplier = creature->GetCreatureTemplate()->ModMana;
9937
9938 switch (new_powertype)
9939 {
9940 default:
9941 case POWER_MANA:
9942 break;
9943 case POWER_RAGE:
9944 SetMaxPower(POWER_RAGE, uint32(std::ceil(GetCreatePowers(POWER_RAGE) * powerMultiplier)));
9945 SetPower(POWER_RAGE, 0);
9946 break;
9947 case POWER_FOCUS:
9948 SetMaxPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
9949 SetPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
9950 break;
9951 case POWER_ENERGY:
9952 SetMaxPower(POWER_ENERGY, uint32(std::ceil(GetCreatePowers(POWER_ENERGY) * powerMultiplier)));
9953 break;
9954 case POWER_HAPPINESS:
9955 SetMaxPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
9956 SetPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
9957 break;
9958 }
9959
9960 if (Player const* player = ToPlayer())
9961 if (player->NeedSendSpectatorData())
9962 {
9963 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PWT", new_powertype);
9964 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetMaxPower(new_powertype) / 10 : GetMaxPower(new_powertype));
9965 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetPower(new_powertype) / 10 : GetPower(new_powertype));
9966 }
9967}
@ GROUP_UPDATE_FLAG_POWER_TYPE
Definition: Group.h:103
@ GROUP_UPDATE_FLAG_PET_POWER_TYPE
Definition: Group.h:115
void SetMaxPower(Powers power, uint32 val)
Definition: Unit.cpp:15544

References WorldObject::FindMap(), GetCreatePowers(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), GetPower(), GROUP_UPDATE_FLAG_PET_POWER_TYPE, GROUP_UPDATE_FLAG_POWER_TYPE, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Object::SetByteValue(), Player::SetGroupUpdateFlag(), SetMaxPower(), SetPower(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_BYTES_0.

Referenced by Pet::CreateBaseAtTamed(), AuraEffect::HandleAuraModShapeshift(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitDataForForm(), Vehicle::Install(), Pet::LoadPetFromDB(), npc_toc_rogue::npc_toc_rogueAI::npc_toc_rogueAI(), SetMinion(), and Player::SummonPet().

◆ SetPvP()

◆ setRace()

void Unit::setRace ( uint8  race)
20899{
20900 if (IsPlayer())
20901 m_race = race;
20902}

References Object::IsPlayer(), and m_race.

◆ SetRedirectThreat()

void Unit::SetRedirectThreat ( ObjectGuid  guid,
uint32  pct 
)
inline
1686{ _redirectThreatInfo.Set(guid, pct); }
void Set(ObjectGuid guid, uint32 pct)
Definition: ThreatMgr.h:302

References _redirectThreatInfo, and RedirectThreatInfo::Set().

Referenced by Spell::EffectRedirectThreat(), and ResetRedirectThreat().

◆ SetResistance()

◆ SetResistanceBuffMods()

void Unit::SetResistanceBuffMods ( SpellSchools  school,
bool  positive,
float  val 
)
inline

◆ SetRooted()

void Unit::SetRooted ( bool  apply,
bool  isStun = false 
)
protected
18108{
18109 if (apply)
18110 {
18111 if (m_rootTimes > 0) // blizzard internal check?
18112 m_rootTimes++;
18113
18114 // MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a)
18115 // this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before
18116 // setting MOVEMENTFLAG_ROOT
18118
18119 if (IsFalling())
18120 {
18122 }
18123 else
18124 {
18126 }
18127
18128 // Creature specific
18129 if (GetTypeId() != TYPEID_PLAYER)
18130 {
18131 if (isStun && movespline->Finalized())
18132 {
18134 }
18135 else
18136 {
18137 StopMoving();
18138 }
18139 }
18140
18141 if (m_movedByPlayer)
18142 {
18143 WorldPacket data(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
18144 data << GetPackGUID();
18145 data << m_rootTimes;
18147 }
18148 else
18149 {
18151 data << GetPackGUID();
18152 SendMessageToSet(&data, true);
18153 }
18154 }
18155 else
18156 {
18158
18159 if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect
18160 {
18161 if (m_movedByPlayer)
18162 {
18164 data << GetPackGUID();
18165 data << m_rootTimes;
18167 }
18168 else
18169 {
18171 data << GetPackGUID();
18172 SendMessageToSet(&data, true);
18173 }
18174 }
18175 }
18176}
@ MOVEMENTFLAG_PENDING_ROOT
Definition: UnitDefines.h:364
@ SMSG_FORCE_MOVE_UNROOT
Definition: Opcodes.h:264
@ SMSG_FORCE_MOVE_ROOT
Definition: Opcodes.h:262
@ SMSG_SPLINE_MOVE_ROOT
Definition: Opcodes.h:824
void StopMovingOnCurrentPos()
Definition: Unit.cpp:16603

References AddUnitMovementFlag(), Movement::MoveSpline::Finalized(), Object::GetPackGUID(), Object::GetTypeId(), HasUnitState(), IsFalling(), m_movedByPlayer, m_rootTimes, MOVEMENTFLAG_MASK_MOVING, MOVEMENTFLAG_PENDING_ROOT, MOVEMENTFLAG_ROOT, movespline, RemoveUnitMovementFlag(), Player::SendDirectMessage(), WorldObject::SendMessageToSet(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_SPLINE_MOVE_ROOT, SMSG_SPLINE_MOVE_UNROOT, StopMoving(), StopMovingOnCurrentPos(), Object::ToPlayer(), TYPEID_PLAYER, and UNIT_STATE_STUNNED.

Referenced by WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), SetControlled(), and SetStunned().

◆ SetShapeshiftForm()

void Unit::SetShapeshiftForm ( ShapeshiftForm  form)
inline

◆ SetSheath()

◆ SetSpeed()

void Unit::SetSpeed ( UnitMoveType  mtype,
float  rate,
bool  forced = false 
)
14342{
14343 if (rate < 0)
14344 rate = 0.0f;
14345
14346 // Update speed only on change
14347 if (m_speed_rate[mtype] == rate)
14348 return;
14349
14350 m_speed_rate[mtype] = rate;
14351
14353
14354 WorldPacket data;
14355 if (!forced)
14356 {
14357 switch (mtype)
14358 {
14359 case MOVE_WALK:
14360 data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14361 break;
14362 case MOVE_RUN:
14363 data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14364 break;
14365 case MOVE_RUN_BACK:
14366 data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14367 break;
14368 case MOVE_SWIM:
14369 data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14370 break;
14371 case MOVE_SWIM_BACK:
14372 data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14373 break;
14374 case MOVE_TURN_RATE:
14375 data.Initialize(MSG_MOVE_SET_TURN_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14376 break;
14377 case MOVE_FLIGHT:
14378 data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14379 break;
14380 case MOVE_FLIGHT_BACK:
14381 data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14382 break;
14383 case MOVE_PITCH_RATE:
14384 data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14385 break;
14386 default:
14387 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14388 return;
14389 }
14390
14391 data << GetPackGUID();
14392 BuildMovementPacket(&data);
14393 data << float(GetSpeed(mtype));
14394 SendMessageToSet(&data, true);
14395 }
14396 else
14397 {
14398 if (IsPlayer())
14399 {
14400 // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
14401 // and do it only for real sent packets and use run for run/mounted as client expected
14402 ++ToPlayer()->m_forced_speed_changes[mtype];
14403
14404 // Xinef: update speed of pet also
14405 if (!IsInCombat())
14406 {
14407 Unit* pet = ToPlayer()->GetPet();
14408 if (!pet)
14409 pet = GetCharm();
14410
14411 // xinef: do not affect vehicles and possesed pets
14412 if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle()))
14413 pet = nullptr;
14414
14416 pet->UpdateSpeed(mtype, forced);
14417 if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID()))
14418 critter->UpdateSpeed(mtype, forced);
14419 }
14420 ToPlayer()->SetCanTeleport(true);
14421 }
14422
14423 switch (mtype)
14424 {
14425 case MOVE_WALK:
14427 break;
14428 case MOVE_RUN:
14430 break;
14431 case MOVE_RUN_BACK:
14433 break;
14434 case MOVE_SWIM:
14436 break;
14437 case MOVE_SWIM_BACK:
14439 break;
14440 case MOVE_TURN_RATE:
14442 break;
14443 case MOVE_FLIGHT:
14445 break;
14446 case MOVE_FLIGHT_BACK:
14448 break;
14449 case MOVE_PITCH_RATE:
14451 break;
14452 default:
14453 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14454 return;
14455 }
14456 data << GetPackGUID();
14457 data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39
14458 if (mtype == MOVE_RUN)
14459 data << uint8(0); // new 2.1.0
14460 data << float(GetSpeed(mtype));
14461 SendMessageToSet(&data, true);
14462 }
14463}
@ MOVE_TURN_RATE
Definition: UnitDefines.h:333
@ MOVE_FLIGHT_BACK
Definition: UnitDefines.h:335
@ MOVE_SWIM_BACK
Definition: UnitDefines.h:332
@ MOVE_PITCH_RATE
Definition: UnitDefines.h:336
@ MOVE_RUN_BACK
Definition: UnitDefines.h:330
@ MOVE_WALK
Definition: UnitDefines.h:328
@ FOLLOW_MOTION_TYPE
Definition: MotionMaster.h:52
@ SMSG_FORCE_TURN_RATE_CHANGE
Definition: Opcodes.h:764
@ MSG_MOVE_SET_SWIM_BACK_SPEED
Definition: Opcodes.h:243
@ MSG_MOVE_SET_TURN_RATE
Definition: Opcodes.h:246
@ SMSG_FORCE_WALK_SPEED_CHANGE
Definition: Opcodes.h:760
@ SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE
Definition: Opcodes.h:929
@ MSG_MOVE_SET_PITCH_RATE
Definition: Opcodes.h:1145
@ SMSG_FORCE_RUN_SPEED_CHANGE
Definition: Opcodes.h:256
@ SMSG_FORCE_SWIM_BACK_SPEED_CHANGE
Definition: Opcodes.h:762
@ SMSG_FORCE_RUN_BACK_SPEED_CHANGE
Definition: Opcodes.h:258
@ SMSG_FORCE_FLIGHT_SPEED_CHANGE
Definition: Opcodes.h:927
@ SMSG_FORCE_SWIM_SPEED_CHANGE
Definition: Opcodes.h:260
@ MSG_MOVE_SET_RUN_SPEED
Definition: Opcodes.h:235
@ MSG_MOVE_SET_FLIGHT_SPEED
Definition: Opcodes.h:924
@ MSG_MOVE_SET_WALK_SPEED
Definition: Opcodes.h:239
@ MSG_MOVE_SET_SWIM_SPEED
Definition: Opcodes.h:241
@ MSG_MOVE_SET_FLIGHT_BACK_SPEED
Definition: Opcodes.h:926
@ SMSG_FORCE_PITCH_RATE_CHANGE
Definition: Opcodes.h:1146
@ MSG_MOVE_SET_RUN_BACK_SPEED
Definition: Opcodes.h:237
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition: Player.h:2376
float GetSpeed(UnitMoveType mtype) const
Definition: Unit.cpp:14336
void propagateSpeedChange()
-------—End of Pet responses methods-------—
Definition: Unit.h:1651
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition: MotionMaster.cpp:859

References BuildMovementPacket(), FOLLOW_MOTION_TYPE, GetCharm(), GetCritterGUID(), MotionMaster::GetCurrentMovementGeneratorType(), GetMotionMaster(), Object::GetPackGUID(), Player::GetPet(), GetSpeed(), Object::GetTypeId(), ObjectAccessor::GetUnit(), HasUnitFlag(), WorldPacket::Initialize(), IsInCombat(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, Player::m_forced_speed_changes, m_speed_rate, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_PITCH_RATE, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_TURN_RATE, MOVE_WALK, MSG_MOVE_SET_FLIGHT_BACK_SPEED, MSG_MOVE_SET_FLIGHT_SPEED, MSG_MOVE_SET_PITCH_RATE, MSG_MOVE_SET_RUN_BACK_SPEED, MSG_MOVE_SET_RUN_SPEED, MSG_MOVE_SET_SWIM_BACK_SPEED, MSG_MOVE_SET_SWIM_SPEED, MSG_MOVE_SET_TURN_RATE, MSG_MOVE_SET_WALK_SPEED, propagateSpeedChange(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, SMSG_FORCE_FLIGHT_SPEED_CHANGE, SMSG_FORCE_PITCH_RATE_CHANGE, SMSG_FORCE_RUN_BACK_SPEED_CHANGE, SMSG_FORCE_RUN_SPEED_CHANGE, SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, SMSG_FORCE_SWIM_SPEED_CHANGE, SMSG_FORCE_TURN_RATE_CHANGE, SMSG_FORCE_WALK_SPEED_CHANGE, Object::ToPlayer(), TYPEID_UNIT, UNIT_FLAG_POSSESSED, and UpdateSpeed().

Referenced by Battleground::AddCreature(), boss_bug_trio::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), boss_zuljin::boss_zuljinAI::EnterPhase(), npc_pet_dk_ebon_gargoyle::npc_pet_dk_ebon_gargoyleAI::FlyAway(), boss_volkhan::boss_volkhanAI::GoToAnvil(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), WorldSession::HandleForceSpeedChangeAck(), modify_commandscript::HandleModifyASpeedCommand(), modify_commandscript::HandleModifyMountCommand(), Creature::InitEntry(), boss_glob_of_viscidus::InitializeAI(), Guardian::InitStatsForLevel(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_sartharion_dragonAI::JustEngagedWith(), boss_four_horsemen::boss_four_horsemenAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), boss_onyxia::MovementInform(), boss_bug_trio::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_akilzon_eagle::npc_akilzon_eagleAI::MovementInform(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_batrider::npc_batrider(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nightbane::PathEndReached(), npc_eastvale_peasent::PathEndReached(), SmartScript::ProcessAction(), boss_nightbane::Reset(), boss_kalec::boss_kalecAI::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_bug_trio::Reset(), boss_sartharion_dragonAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_volkhan::boss_volkhanAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), npc_freed_protodrake::npc_freed_protodrakeAI::Reset(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), npc_eastvale_peasent::SetData(), Battlefield::SpawnCreature(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_akilzon_eagle::npc_akilzon_eagleAI::UpdateAI(), boss_zuljin::boss_zuljinAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), UpdateSpeed(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetSpeedRate()

◆ SetStandFlags()

◆ SetStandState()

void Unit::SetStandState ( uint8  state)
16641{
16643
16644 if (IsStandState())
16646
16647 if (IsPlayer())
16648 {
16650 data << (uint8)state;
16651 ToPlayer()->GetSession()->SendPacket(&data);
16652 }
16653}
@ UNIT_BYTES_1_OFFSET_STAND_STATE
Definition: UnitDefines.h:23
@ SMSG_STANDSTATE_UPDATE
Definition: Opcodes.h:699

References AURA_INTERRUPT_FLAG_NOT_SEATED, Player::GetSession(), Object::IsPlayer(), IsStandState(), RemoveAurasWithInterruptFlags(), WorldSession::SendPacket(), Object::SetByteValue(), SMSG_STANDSTATE_UPDATE, Object::ToPlayer(), UNIT_BYTES_1_OFFSET_STAND_STATE, and UNIT_FIELD_BYTES_1.

Referenced by _ApplyAura(), npc_mograine::npc_mograineAI::AshbringerEvent(), boss_felmyst::boss_felmystAI::boss_felmystAI(), boss_kologarn::boss_kologarnAI::boss_kologarnAI(), boss_twinemperorsAI::boss_twinemperorsAI(), boss_thekal::CheckPhaseTransition(), npc_ringo::npc_ringoAI::ClearFaint(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), CombatStart(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), boss_thekal::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_nightbane::DoAction(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_the_lurker_below::DoAction(), boss_leotheras_the_blind::DoAction(), npc_madrigosa::npc_madrigosaAI::DoAction(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), Spell::DoAllEffectOnTarget(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_ahune::Emerge(), UtherBatteredHiltEvent::Execute(), SuckBackEvent::Execute(), boss_ahune::ExecuteEvent(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::FeignDeath(), WorldSession::HandleAlterAppearance(), WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStandStateChangeOpcode(), spell_q11322_q11317_the_cleansing::if(), DistractMovementGenerator::Initialize(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_kalecgos::boss_kalecgosAI::JustEngagedWith(), boss_palehoof::boss_palehoofAI::JustReachedHome(), npc_massive_jormungar::npc_massive_jormungarAI::JustReachedHome(), npc_ferocious_rhino::npc_ferocious_rhinoAI::JustReachedHome(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::JustReachedHome(), npc_frenzied_worgen::npc_frenzied_worgenAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), npc_mograine::npc_mograineAI::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_kologarn::boss_kologarnAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_twilight_volunteer::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), npc_madrigosa::npc_madrigosaAI::npc_madrigosaAI(), spell_love_is_in_the_air_romantic_picnic::OnApply(), boss_shade_of_aran::OnPowerUpdate(), npc_kernobee::OnQuestAccept(), npc_koltira_deathweaver::OnQuestAccept(), npc_kerlonian::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_ringo::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_bonker_togglevolt::OnQuestAccept(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), PretendToDie(), boss_alar::PretendToDie(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_kalecgos::boss_kalecgosAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_thekal::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Reset(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::Reset(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), Resurrect(), boss_the_lurker_below::SchedulerPhaseOne(), boss_the_lurker_below::SchedulerPhaseTwo(), npc_ringo::npc_ringoAI::SetFaint(), npc_kurenai_captive::npc_kurenai_captiveAI::SetGUID(), SetInCombatState(), npc_kerlonian::npc_kerlonianAI::SetSleeping(), SetStunned(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_ahune::Submerge(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_corporal_keeshan::npc_corporal_keeshanAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::npc_forest_frogAI::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), GameObject::Use(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetStat()

void Unit::SetStat ( Stats  stat,
int32  val 
)
inline

◆ SetStunned()

void Unit::SetStunned ( bool  apply)
protected
18060{
18062 {
18063 return;
18064 }
18065
18066 if (apply)
18067 {
18068 SetTarget();
18070
18071 if (IsPlayer())
18072 {
18074 }
18075
18076 SetRooted(true, true);
18077
18078 CastStop();
18079 }
18080 else
18081 {
18082 if (IsAlive() && GetVictim())
18084
18085 if (GetTypeId() == TYPEID_UNIT)
18086 {
18087 // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface)
18088 Unit* owner = GetOwner();
18089 if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !owner->ToPlayer()->IsMounted())
18091
18092 // Xinef: same for charmed npcs
18093 owner = GetCharmer();
18094 if (!owner || owner->GetTypeId() != TYPEID_PLAYER || !owner->ToPlayer()->IsMounted())
18096 }
18097 else
18099
18100 if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
18101 {
18102 SetRooted(false, true);
18103 }
18104 }
18105}

References CastStop(), GetCharmer(), Object::GetGUID(), GetOwner(), Object::GetTypeId(), GetVictim(), HasUnitState(), IsAlive(), IsMounted(), Object::IsPlayer(), RemoveUnitFlag(), SetRooted(), SetStandState(), SetTarget(), SetUnitFlag(), Object::ToPlayer(), TYPEID_PLAYER, TYPEID_UNIT, UNIT_FLAG_STUNNED, UNIT_STAND_STATE_STAND, UNIT_STATE_IN_FLIGHT, and UNIT_STATE_ROOT.

Referenced by SetControlled().

◆ SetSwim()

bool Unit::SetSwim ( bool  enable)
virtual

◆ SetTarget()

virtual void Unit::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
pure virtual

◆ setTransForm()

void Unit::setTransForm ( uint32  spellid)
inline
1515{ m_transform = spellid;}

References m_transform.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetUInt32Value()

void Unit::SetUInt32Value ( uint16  index,
uint32  value 
)
21180{
21181 Object::SetUInt32Value(index, value);
21182
21183 switch (index)
21184 {
21185 // Invalidating the cache on health change should fix an issue where the client sees dead NPCs when they are not.
21186 // We might also need to invalidate the cache for some other fields as well.
21187 case UNIT_FIELD_HEALTH:
21189 break;
21190 }
21191}
void SetUInt32Value(uint16 index, uint32 value)
Definition: Object.cpp:650
void InvalidateValuesUpdateCache()
Definition: Unit.h:1905

References InvalidateValuesUpdateCache(), Object::SetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_LoadDailyQuestStatus(), Player::_LoadSkills(), Player::AddItemToBuyBackSlot(), Attack(), Player::CheckAreaExploreAndOutdoor(), Spell::CheckItems(), Player::Create(), Pet::CreateBaseAtTamed(), Player::CreatePet(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), Dismount(), boss_thekal::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_pathaleon_the_calculator::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), Player::DuelComplete(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), boss_jindo::EnterEvadeMode(), boss_zuljin::boss_zuljinAI::EnterPhase(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraTransform(), character_commandscript::HandleCharacterLevel(), debug_commandscript::HandleDebugMod32ValueCommand(), debug_commandscript::HandleDebugUpdateCommand(), spell_dk_dancing_rune_weapon_visual::HandleEffectApply(), spell_gen_model_visible::HandleEffectApply(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_baby_murloc::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), misc_commandscript::HandleHideAreaCommand(), modify_commandscript::HandleModifyStandStateCommand(), modify_commandscript::HandleMorphMountCommand(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandleNoReagentUseAura(), npc_commandscript::HandleNpcPlayEmoteCommand(), WorldSession::HandlePetRename(), reset_commandscript::HandleResetHonorCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), WorldSession::HandleSetTitleOpcode(), WorldSession::HandleSetWatchedFactionOpcode(), misc_commandscript::HandleShowAreaCommand(), WorldSession::HandleTextEmoteOpcode(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), Player::InitGlyphsForLevel(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Initialize(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), InitTamedPet(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustDied(), boss_xt002::boss_xt002AI::JustEngagedWith(), npc_dragonflayer_forge_master::npc_dragonflayer_forge_masterAI::JustEngagedWith(), boss_jindo::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Kill(), Creature::LoadCreaturesAddon(), Creature::LoadEquipment(), Player::LoadFromDB(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Player::ModifySkillBonus(), Mount(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_tirion_fordring_tft::npc_tirion_fordringAI::MovementInform(), npc_thassarian2::npc_thassarian2AI::MovementInform(), npc_apothecary_genericAI::MovementInform(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::npc_pos_martin_or_gorkun_secondAI(), spell_gen_clone_weapon_aura::OnApply(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_ame::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), spell_gen_clone_weapon_aura::OnRemove(), npc_eastvale_peasent::PathEndReached(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), Player::RemoveAmmo(), Player::RemoveItemFromBuyBackSlot(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), ReplaceAllDynamicFlags(), ReplaceAllNpcFlags(), Player::ReplaceAllPlayerFlags(), ReplaceAllUnitFlags(), ReplaceAllUnitFlags2(), boss_ragnaros::boss_ragnarosAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_zuljin::boss_zuljinAI::Reset(), boss_arlokk::boss_arlokkAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), npc_hor_leader::npc_hor_leaderAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetDailyQuestStatus(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), Spell::SendChannelStart(), Spell::SendChannelUpdate(), Player::SetAmmo(), Player::SetArenaPoints(), Player::SetArenaTeamInfoField(), SetCharmedBy(), SetCreateHealth(), SetCreateMana(), Player::SetCurrentTitle(), Player::SetDailyQuestStatus(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), npc_eastvale_peasent::SetData(), setDeathState(), Player::setDeathState(), SetDisplayId(), ScriptedAI::SetEquipmentSlots(), SetFaction(), Player::SetFreePrimaryProfessions(), Player::SetFreeTalentPoints(), Player::SetGlyph(), Player::SetGlyphSlot(), SetHealth(), Player::SetHonorPoints(), Player::SetInGuild(), SetLevel(), SetMaxHealth(), Player::SetMoney(), SetNativeDisplayId(), CharmInfo::SetPetNumber(), Player::SetQuestSlot(), Player::SetQuestSlotTimer(), Player::SetRank(), Player::SetRestBonus(), Player::SetSkill(), Player::SetVisibleItemSlot(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Map::SummonCreature(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), Player::SummonPet(), Player::SwapQuestSlot(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_harrison_jones::npc_harrison_jonesAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), Player::UpdateArmorPenetration(), Player::UpdateDuelFlag(), Player::UpdateExpertise(), Player::UpdateHonorFields(), Player::UpdateRating(), Player::UpdateShieldBlockValue(), Player::UpdateSkill(), Player::UpdateSkillPro(), Player::UpdateSkillsForLevel(), Player::UpdateSkillsToMaxSkillsForLevel(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), and npc_ranger_lilatha::WaypointReached().

◆ SetUnitFlag()

void Unit::SetUnitFlag ( UnitFlags  flags)
inline
825{ SetFlag(UNIT_FIELD_FLAGS, flags); }

References Object::SetFlag(), and UNIT_FIELD_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::AddPortals(), Creature::AllLootRemovedFromCorpse(), npc_doctor::npc_doctorAI::BeginEvent(), boss_jarien::boss_jarien(), boss_sothos::boss_sothos(), GameObject::CastSpell(), Player::Create(), boss_felblood_kaelthas::DamageTaken(), npc_mograine::npc_mograineAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_kiljaeden::boss_kiljaedenAI::DamageTaken(), boss_muru::boss_muruAI::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crystalline_frayer::npc_crystalline_frayerAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_illidan_stormrage::boss_illidan_stormrageAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Deactivate(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_felmyst::boss_felmystAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), PetAI::DoAttack(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_erekem::boss_erekemAI::EnterEvadeMode(), boss_ichoron::boss_ichoronAI::EnterEvadeMode(), boss_lavanthor::boss_lavanthorAI::EnterEvadeMode(), boss_moragg::boss_moraggAI::EnterEvadeMode(), boss_xevozz::boss_xevozzAI::EnterEvadeMode(), boss_zuramat::boss_zuramatAI::EnterEvadeMode(), boss_anubarak_trial::boss_anubarak_trialAI::EnterEvadeMode(), boss_jaraxxus::boss_jaraxxusAI::EnterEvadeMode(), boss_gormok::boss_gormokAI::EnterEvadeMode(), boss_jormungarAI::EnterEvadeMode(), boss_icehowl::boss_icehowlAI::EnterEvadeMode(), boss_zuljin::boss_zuljinAI::EnterPhase(), SACDeactivateEvent::Execute(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::FeignDeath(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_gen_model_visible::HandleEffectApply(), spell_gen_feign_death_all_flags::HandleEffectApply(), spell_gen_feign_death_no_dyn_flag::HandleEffectApply(), spell_gen_feign_death_no_prevent_emotes::HandleEffectApply(), AuraEffect::HandleFeignDeath(), BattlefieldWG::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleLogoutRequestOpcode(), spell_oculus_rider_aura::HandleOnEffectApply(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_malchezaar_axe::Initialize(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::Initialize(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::InitializeAI(), boss_kiljaeden::boss_kiljaedenAI::InitializeAI(), npc_general_andorov::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), Player::InitStatsForLevel(), boss_kologarn::boss_kologarnAI::JustDied(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_felmyst::boss_felmystAI::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_gothik::boss_gothikAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_illidan_stormrage::boss_illidan_stormrageAI::JustSummoned(), boss_vaelastrasz::boss_vaelAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Mount(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_batrider::npc_batrider(), npc_chess_move_trigger::npc_chess_move_trigger(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_q24545_vegard::npc_q24545_vegardAI::npc_q24545_vegardAI(), npc_xt002_heart::npc_xt002_heartAI::npc_xt002_heartAI(), spell_halion_twilight_phasing_aura::OnApply(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), Creature::RefreshSwimmingFlag(), boss_keristrasza::boss_keristraszaAI::RemovePrison(), npc_grimstone::npc_grimstoneAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), npc_hallows_end_soh::Reset(), npc_ancient_wisp::Reset(), boss_cthun::Reset(), npc_depth_charge::npc_depth_chargeAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_death_ravager::npc_death_ravagerAI::Reset(), npc_giant_spotlight::npc_giant_spotlightAI::Reset(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_announcer_toc5::npc_announcer_toc5AI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_tyrannus::boss_tyrannusAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_malygos::boss_malygosAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_massive_jormungar::npc_massive_jormungarAI::Reset(), npc_ferocious_rhino::npc_ferocious_rhinoAI::Reset(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::Reset(), npc_frenzied_worgen::npc_frenzied_worgenAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), npc_drakuru_shackles::npc_drakuru_shacklesAI::Reset(), boss_shade_of_akama::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), boss_warlord_kalithresh::Reset(), boss_broggok::Reset(), boss_kelidan_the_breaker::Reset(), boss_magtheridon::Reset(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_the_lurker_below::SchedulerPhaseOne(), Player::SendLoot(), SetCharm(), SetCharmedBy(), SetImmuneToNPC(), SetImmuneToPC(), SetInCombatState(), Player::SetIsSpectator(), SetMinion(), SetStunned(), SetSwim(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::ShowNpc(), boss_zuljin::boss_zuljinAI::SpawnAdds(), npc_netherspite_infernal::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), npc_giant_claw_tentacle::Submerge(), boss_ouro::Submerge(), boss_ahune::Submerge(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_blistering_zombie::npc_blistering_zombieAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and Creature::UpdateEntry().

◆ SetUnitFlag2()

◆ SetUnitMovementFlags()

◆ SetVisible()

void Unit::SetVisible ( bool  x)
14148{
14149 if (!x)
14151 else
14153
14155}
@ SEC_GAMEMASTER
Definition: Common.h:58

References WorldObject::m_serverSideVisibility, SEC_GAMEMASTER, SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by _ExitVehicle(), boss_felmyst::boss_felmystAI::boss_felmystAI(), Creature::Create(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), boss_archimonde::DoAction(), boss_felmyst::boss_felmystAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), HideNpcEvent::Execute(), UtherBatteredHiltEvent::Execute(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::FinishQuest(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), BattlegroundSA::HandleKillUnit(), Battlefield::HideNpc(), boss_kiljaeden::boss_kiljaedenAI::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), npc_xt002_heart::npc_xt002_heartAI::JustDied(), boss_kalecgos::boss_kalecgosAI::JustReachedHome(), npc_rocket_propelled_warhead::npc_rocket_propelled_warheadAI::JustReachedHome(), SmartAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_hazzarah::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::MovementInform(), boss_vazruden_the_herald::MovementInform(), npc_shattered_hand_scout::MovementInform(), npc_madrigosa::npc_madrigosaAI::npc_madrigosaAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::npc_time_lost_proto_drakeAI(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnCreatureCreate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnCreatureCreate(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::PassengerBoarded(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_midnight::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_muru::boss_muruAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_archimonde::Reset(), boss_eye_of_cthun::Reset(), npc_murkdeep::npc_murkdeepAI::Reset(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_pos_leader::npc_pos_leaderAI::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_ionar::boss_ionarAI::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), npc_minigob_manabonk::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_vazruden_the_herald::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SetData(), Battlefield::ShowNpc(), boss_ionar::boss_ionarAI::Split(), boss_warchief_kargath_bladefist::SummonedCreatureDies(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_madrigosa::npc_madrigosaAI::UpdateAI(), boss_kalecgos::boss_kalecgosAI::UpdateAI(), boss_kiljaeden::boss_kiljaedenAI::UpdateAI(), boss_muru::boss_muruAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI(), SmartAI::UpdateDespawn(), npc_grimstone::npc_grimstoneAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_taretha::npc_tarethaAI::WaypointReached().

◆ SetVisibleAura()

void Unit::SetVisibleAura ( uint8  slot,
AuraApplication aur 
)
inline

◆ SetWalk()

bool Unit::SetWalk ( bool  enable)
virtual

Reimplemented in Creature.

20440{
20441 if (enable == IsWalking())
20442 return false;
20443
20444 if (enable)
20446 else
20448
20450 return true;
20451}
bool IsWalking() const
Definition: Unit.h:1721

References AddUnitMovementFlag(), IsWalking(), MOVEMENTFLAG_WALKING, propagateSpeedChange(), and RemoveUnitMovementFlag().

Referenced by debug_commandscript::HandleDebugMoveflagsCommand(), SetCharm(), and Creature::SetWalk().

◆ SetWaterWalking()

bool Unit::SetWaterWalking ( bool  enable,
bool  packetOnly = false 
)
virtual

Reimplemented in Player, and Creature.

20509{
20511 return false;
20512
20513 if (enable)
20515 else
20517
20518 return true;
20519}
@ MOVEMENTFLAG_WATERWALKING
Definition: UnitDefines.h:372

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_WATERWALKING, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraWaterWalk(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ SpellBaseDamageBonusDone()

int32 Unit::SpellBaseDamageBonusDone ( SpellSchoolMask  schoolMask)
11859{
11860 int32 DoneAdvertisedBenefit = 0;
11861
11863 for (AuraEffectList::const_iterator i = mDamageDone.begin(); i != mDamageDone.end(); ++i)
11864 if (((*i)->GetMiscValue() & schoolMask) != 0 &&
11865 (*i)->GetSpellInfo()->EquippedItemClass == -1 &&
11866 // -1 == any item class (not wand then)
11867 (*i)->GetSpellInfo()->EquippedItemInventoryTypeMask == 0)
11868 // 0 == any inventory type (not wand then)
11869 DoneAdvertisedBenefit += (*i)->GetAmount();
11870
11871 if (IsPlayer())
11872 {
11873 // Base value
11874 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
11875
11876 // Damage bonus from stats
11878 for (AuraEffectList::const_iterator i = mDamageDoneOfStatPercent.begin(); i != mDamageDoneOfStatPercent.end(); ++i)
11879 {
11880 if ((*i)->GetMiscValue() & schoolMask)
11881 {
11882 // stat used stored in miscValueB for this aura
11883 Stats usedStat = Stats((*i)->GetMiscValueB());
11884 DoneAdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
11885 }
11886 }
11887 // ... and attack power
11889 for (AuraEffectList::const_iterator i = mDamageDonebyAP.begin(); i != mDamageDonebyAP.end(); ++i)
11890 if ((*i)->GetMiscValue() & schoolMask)
11891 DoneAdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
11892 }
11893 return DoneAdvertisedBenefit;
11894}
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER
Definition: SpellAuraDefines.h:300
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:237
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition: SpellAuraDefines.h:76
uint32 GetBaseSpellPowerBonus()
Definition: Player.h:1947

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by spell_item_wraith_scythe_drain_life::CalculateDamage(), spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), Spell::EffectWeaponDmg(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), SpellDamageBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseDamageBonusTaken()

int32 Unit::SpellBaseDamageBonusTaken ( SpellSchoolMask  schoolMask,
bool  isDoT = false 
)
11897{
11898 int32 TakenAdvertisedBenefit = 0;
11899
11901 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
11902 if (((*i)->GetMiscValue() & schoolMask) != 0)
11903 {
11904 // Xinef: if we have DoT damage type and aura has charges, check if it affects DoTs
11905 // Xinef: required for hemorrhage & rupture / garrote
11906 if (isDoT && (*i)->GetBase()->IsUsingCharges() && !((*i)->GetSpellInfo()->ProcFlags & PROC_FLAG_TAKEN_PERIODIC))
11907 continue;
11908
11909 TakenAdvertisedBenefit += (*i)->GetAmount();
11910 }
11911
11912 return TakenAdvertisedBenefit;
11913}

References GetAuraEffectsByType(), PROC_FLAG_TAKEN_PERIODIC, and SPELL_AURA_MOD_DAMAGE_TAKEN.

Referenced by HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), and SpellDamageBonusTaken().

◆ SpellBaseHealingBonusDone()

int32 Unit::SpellBaseHealingBonusDone ( SpellSchoolMask  schoolMask)
12624{
12625 int32 AdvertisedBenefit = 0;
12626
12628 for (AuraEffectList::const_iterator i = mHealingDone.begin(); i != mHealingDone.end(); ++i)
12629 if (!(*i)->GetMiscValue() || ((*i)->GetMiscValue() & schoolMask) != 0)
12630 AdvertisedBenefit += (*i)->GetAmount();
12631
12632 // Healing bonus of spirit, intellect and strength
12633 if (IsPlayer())
12634 {
12635 // Base value
12636 AdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12637
12638 // Healing bonus from stats
12640 for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i)
12641 {
12642 // stat used dependent from misc value (stat index)
12643 Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue);
12644 AdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12645 }
12646
12647 // ... and attack power
12649 for (AuraEffectList::const_iterator i = mHealingDonebyAP.begin(); i != mHealingDonebyAP.end(); ++i)
12650 if ((*i)->GetMiscValue() & schoolMask)
12651 AdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12652 }
12653 return AdvertisedBenefit;
12654}
@ SPELL_AURA_MOD_HEALING_DONE
Definition: SpellAuraDefines.h:198
@ SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
Definition: SpellAuraDefines.h:238
@ SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER
Definition: SpellAuraDefines.h:301

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_HEALING_DONE, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by CalculateSpellAmount(), SpellHealingBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseHealingBonusTaken()

int32 Unit::SpellBaseHealingBonusTaken ( SpellSchoolMask  schoolMask)
12657{
12658 int32 AdvertisedBenefit = 0;
12659
12661 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12662 if (((*i)->GetMiscValue() & schoolMask) != 0)
12663 AdvertisedBenefit += (*i)->GetAmount();
12664
12665 return AdvertisedBenefit;
12666}
@ SPELL_AURA_MOD_HEALING
Definition: SpellAuraDefines.h:178

References GetAuraEffectsByType(), and SPELL_AURA_MOD_HEALING.

Referenced by SpellHealingBonusTaken().

◆ SpellCriticalDamageBonus()

uint32 Unit::SpellCriticalDamageBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12203{
12204 // Calculate critical bonus
12205 int32 crit_bonus = damage;
12206 float crit_mod = 0.0f;
12207
12208 switch (spellProto->DmgClass)
12209 {
12210 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12213 crit_bonus += damage;
12214 break;
12215 default:
12216 crit_bonus += damage / 2; // for spells is 50%
12217 break;
12218 }
12219
12220 if (caster)
12221 {
12222 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask());
12223
12224 if (victim)
12225 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, victim->GetCreatureTypeMask());
12226
12227 if (crit_bonus != 0 && crit_mod != 0.0f)
12228 AddPct(crit_bonus, crit_mod);
12229
12230 crit_bonus -= damage;
12231
12232 // adds additional damage to critBonus (from talents)
12233 if (Player* modOwner = caster->GetSpellModOwner())
12234 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12235
12236 crit_bonus += damage;
12237 }
12238
12239 return crit_bonus;
12240}

References AddPct(), SpellInfo::DmgClass, GetCreatureTypeMask(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellCriticalHealingBonus()

uint32 Unit::SpellCriticalHealingBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12243{
12244 // Calculate critical bonus
12245 int32 crit_bonus;
12246 switch (spellProto->DmgClass)
12247 {
12248 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12251 crit_bonus = damage;
12252 break;
12253 default:
12254 crit_bonus = damage / 2; // for spells is 50%
12255 break;
12256 }
12257
12258 if (caster)
12259 {
12260 if (victim)
12261 {
12262 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
12263 crit_bonus = int32(crit_bonus * caster->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
12264 }
12265
12266 // adds additional damage to critBonus (from talents)
12267 // xinef: used for death knight death coil
12268 if (Player* modOwner = caster->GetSpellModOwner())
12269 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12270 }
12271
12272 if (crit_bonus > 0)
12273 damage += crit_bonus;
12274
12275 if (caster)
12276 damage = int32(float(damage) * caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
12277
12278 return damage;
12279}
@ SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
Definition: SpellAuraDefines.h:113

References SpellInfo::DmgClass, GetCreatureTypeMask(), GetSpellModOwner(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by Spell::DoAllEffectOnTarget(), and AuraEffect::HandlePeriodicHealAurasTick().

◆ SpellDamageBonusDone()

uint32 Unit::SpellDamageBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
11537{
11538 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11539 return pdamage;
11540
11541 // Some spells don't benefit from done mods
11542 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11543 return pdamage;
11544
11545 // For totems get damage bonus from owner
11546 if (GetTypeId() == TYPEID_UNIT)
11547 {
11548 if (IsTotem())
11549 {
11550 if (Unit* owner = GetOwner())
11551 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack);
11552 }
11553 // Dancing Rune Weapon...
11554 else if (GetEntry() == 27893)
11555 {
11556 if (Unit* owner = GetOwner())
11557 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack) / 2;
11558 }
11559 }
11560
11561 // Done total percent damage auras
11562 float ApCoeffMod = 1.0f;
11563 int32 DoneTotal = 0;
11564 float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);
11565
11566 // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controled Damage
11568 DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
11569
11570 // Some spells don't benefit from pct done mods
11571 if (!spellProto->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS))
11572 {
11573 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11574 // Add flat bonus from spell damage versus
11576 }
11577
11578 // done scripted mod (take it from owner)
11579 Unit* owner = GetOwner() ? GetOwner() : this;
11580 int32 DoneAdvertisedBenefit = 0;
11581 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11582 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11583 {
11584 if (!(*i)->IsAffectedOnSpell(spellProto))
11585 continue;
11586
11587 switch ((*i)->GetMiscValue())
11588 {
11589 case 4418: // Increased Shock Damage
11590 case 4554: // Increased Lightning Damage
11591 case 4555: // Improved Moonfire
11592 case 5142: // Increased Lightning Damage
11593 case 5147: // Improved Consecration / Libram of Resurgence
11594 case 5148: // Idol of the Shooting Star
11595 case 6008: // Increased Lightning Damage
11596 case 8627: // Totem of Hex
11597 {
11598 DoneAdvertisedBenefit += (*i)->GetAmount();
11599 break;
11600 }
11601 }
11602 }
11603
11604 // Custom scripted damage
11605 switch (spellProto->SpellFamilyName)
11606 {
11607 case SPELLFAMILY_DRUID:
11608 {
11609 // Insect Swarm vs Item - Druid T8 Balance Relic
11610 if (spellProto->SpellFamilyFlags[0] & 0x00200000)
11611 {
11612 if (AuraEffect const* relicAurEff = GetAuraEffect(64950, EFFECT_0))
11613 {
11614 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11615 }
11616 }
11617
11618 // Nourish vs Idol of the Flourishing Life
11619 if (spellProto->SpellFamilyFlags[1] & 0x02000000)
11620 {
11621 if (AuraEffect const* relicAurEff = GetAuraEffect(64949, EFFECT_0))
11622 {
11623 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11624 }
11625 }
11626 break;
11627 }
11629 {
11630 // Sigil of the Vengeful Heart
11631 if (spellProto->SpellFamilyFlags[0] & 0x2000)
11632 {
11633 if (AuraEffect* aurEff = GetAuraEffect(64962, EFFECT_1))
11634 {
11635 AddPct(DoneTotal, aurEff->GetAmount());
11636 }
11637 }
11638
11639 // Impurity
11641 {
11642 AddPct(ApCoeffMod, aurEff->GetAmount());
11643 }
11644
11645 // Blood Boil - bonus for diseased targets
11646 if ((spellProto->SpellFamilyFlags[0] & 0x00040000) && victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0, 0x00000002, GetGUID()))
11647 {
11648 DoneTotal += 95;
11649 ApCoeffMod = 1.5835f;
11650 }
11651 break;
11652 }
11653 default:
11654 break;
11655 }
11656
11657 // Done fixed damage bonus auras
11658 DoneAdvertisedBenefit += SpellBaseDamageBonusDone(spellProto->GetSchoolMask());
11659
11660 // Check for table values
11661 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
11662 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11663 if (bonus)
11664 {
11665 if (damagetype == DOT)
11666 {
11667 coeff = bonus->dot_damage;
11668 if (bonus->ap_dot_bonus > 0)
11669 {
11670 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11672 APbonus += GetTotalAttackPowerValue(attType);
11673 DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
11674 }
11675 }
11676 else
11677 {
11678 coeff = bonus->direct_damage;
11679 if (bonus->ap_bonus > 0)
11680 {
11681 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11683 APbonus += GetTotalAttackPowerValue(attType);
11684 DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
11685 }
11686 }
11687 }
11688
11689 // Default calculation
11690 if (coeff && DoneAdvertisedBenefit)
11691 {
11692 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11693
11694 if (Player* modOwner = GetSpellModOwner())
11695 {
11696 coeff *= 100.0f;
11697 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
11698 coeff /= 100.0f;
11699 }
11700
11701 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
11702 }
11703
11704 float tmpDamage = (float(pdamage) + DoneTotal) * DoneTotalMod;
11705 // apply spellmod to Done damage (flat and pct)
11706 if (Player* modOwner = GetSpellModOwner())
11707 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
11708
11709 return uint32(std::max(tmpDamage, 0.0f));
11710}
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
Definition: SpellAuraDefines.h:243
@ SPELLMOD_DOT
Definition: SpellDefines.h:99
@ SPELLMOD_BONUS_MULTIPLIER
Definition: SpellDefines.h:101
@ SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS
Definition: SharedDefines.h:633
float GetSpellDamageMod(int32 Rank)
Definition: Creature.cpp:1604
float SpellPctDamageModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition: Unit.cpp:11205
float CalculateLevelPenalty(SpellInfo const *spellProto) const
Definition: Unit.cpp:3004
Definition: SpellMgr.h:324
float ap_dot_bonus
Definition: SpellMgr.h:328
float dot_damage
Definition: SpellMgr.h:326
float ap_bonus
Definition: SpellMgr.h:327
float direct_damage
Definition: SpellMgr.h:325

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, EFFECT_0, EFFECT_1, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), SpellInfo::GetSchoolMask(), Creature::GetSpellDamageMod(), GetSpellModOwner(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Object::GetTypeId(), SpellInfo::HasAttribute(), SpellInfo::Id, IsControlledByPlayer(), IsGuardian(), IsPet(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_DAMAGE_CLASS_MELEE, SpellBaseDamageBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctDamageModsDone(), sSpellMgr, Object::ToCreature(), and TYPEID_UNIT.

Referenced by spell_warl_seed_of_corruption_aura::CalculateAmount(), AuraEffect::CalculateAmount(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), spell_warr_bloodthirst::HandleDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ SpellDamageBonusTaken()

uint32 Unit::SpellDamageBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint32  stack = 1 
)
11713{
11714 if (!spellProto || damagetype == DIRECT_DAMAGE)
11715 return pdamage;
11716
11717 int32 TakenTotal = 0;
11718 float TakenTotalMod = 1.0f;
11719
11720 // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
11721 // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
11723 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
11724 if (((*i)->GetMiscValue() & spellProto->GetSchoolMask()))
11725 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11726 AddPct(TakenTotalMod, (*i)->GetAmount());
11727
11728 TakenTotalMod = processDummyAuras(TakenTotalMod);
11729
11730 // From caster spells
11731 if (caster)
11732 {
11734 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
11735 if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
11736 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11737 AddPct(TakenTotalMod, (*i)->GetAmount());
11738 }
11739
11740 if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask())
11741 {
11742 int32 modifierMax = 0;
11743 int32 modifierMin = 0;
11745 for (AuraEffectList::const_iterator i = auraEffectList.begin(); i != auraEffectList.end(); ++i)
11746 {
11747 if (!spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11748 continue;
11749
11750 // Only death knight spell with this aura
11751 if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
11752 if (!caster || caster->GetGUID() != (*i)->GetCasterGUID())
11753 continue;
11754
11755 if (mechanicMask & uint32(1 << (*i)->GetMiscValue()))
11756 {
11757 if ((*i)->GetAmount() > 0)
11758 {
11759 if ((*i)->GetAmount() > modifierMax)
11760 modifierMax = (*i)->GetAmount();
11761 }
11762 else if ((*i)->GetAmount() < modifierMin)
11763 modifierMin = (*i)->GetAmount();
11764 }
11765 }
11766
11767 AddPct(TakenTotalMod, modifierMax);
11768 AddPct(TakenTotalMod, modifierMin);
11769 }
11770
11771 int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask(), damagetype == DOT);
11772
11773 // Check for table values
11774 float coeff = 0;
11775 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11776 if (bonus)
11777 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
11778
11779 // Default calculation
11780 if (TakenAdvertisedBenefit)
11781 {
11782 if (coeff <= 0.0f)
11783 {
11784 if (caster)
11785 coeff = caster->CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11786 else
11787 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11788 }
11789
11790 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11791 TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
11792 }
11793
11794 // No positive taken bonus, custom attr
11795 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
11796 {
11797 TakenTotal = 0;
11798 TakenTotalMod = 1.0f;
11799 }
11800
11801 // xinef: sanctified wrath talent
11802 if (caster && TakenTotalMod < 1.0f && caster->HasAuraType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST))
11803 {
11804 float ignoreModifier = 1.0f - TakenTotalMod;
11805 bool addModifier = false;
11807 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
11808 if ((*j)->GetMiscValue() & spellProto->SchoolMask)
11809 {
11810 ApplyPct(ignoreModifier, (*j)->GetAmount());
11811 addModifier = true;
11812 }
11813
11814 if (addModifier)
11815 TakenTotalMod += ignoreModifier;
11816 }
11817
11818 float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
11819
11820 return uint32(std::max(tmpDamage, 0.0f));
11821}
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
Definition: Unit.cpp:17110

References AddPct(), ApplyPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, DOT, SpellBonusEntry::dot_damage, SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasAuraType(), SpellInfo::Id, processDummyAuras(), SpellInfo::SchoolMask, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, sSpellMgr, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by DealMeleeDamage(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and spell_black_temple_l5_arcane_charge::PrepareSpellScript().

◆ SpellDoneCritChance()

float Unit::SpellDoneCritChance ( Unit const *  ,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
11916{
11917 // Mobs can't crit with spells.
11918 if (GetTypeId() == TYPEID_UNIT && !GetSpellModOwner())
11919 return -100.0f;
11920
11921 // not critting spell
11922 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
11923 return 0.0f;
11924
11925 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
11926 if (!skipEffectCheck && !spellProto->IsCritCapable())
11927 return 0.0f;
11928
11929 float crit_chance = 0.0f;
11930 switch (spellProto->DmgClass)
11931 {
11933 {
11934 if (schoolMask & SPELL_SCHOOL_MASK_NORMAL)
11935 crit_chance = 0.0f;
11936 // For other schools
11937 else if (IsPlayer())
11938 crit_chance = GetFloatValue(static_cast<uint16>(PLAYER_SPELL_CRIT_PERCENTAGE1) + GetFirstSchoolInMask(schoolMask));
11939 else
11940 {
11941 crit_chance = (float)m_baseSpellCritChance;
11943 }
11944 break;
11945 }
11948 {
11949 if (IsPlayer())
11950 {
11951 switch (attackType)
11952 {
11953 case BASE_ATTACK:
11955 break;
11956 case OFF_ATTACK:
11958 break;
11959 case RANGED_ATTACK:
11961 break;
11962 default:
11963 break;
11964 }
11965 }
11966 else
11967 {
11968 crit_chance = 5.0f;
11971 }
11973 break;
11974 }
11975 // values overridden in spellmgr for lifebloom and earth shield
11977 default:
11978 return 0.0f;
11979 }
11980
11981 // percent done
11982 // only players use intelligence for critical chance computations
11983 if (Player* modOwner = GetSpellModOwner())
11984 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
11985
11986 // xinef: can be negative!
11987 return crit_chance;
11988}
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition: UpdateFields.h:354
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition: SpellAuraDefines.h:134
@ SPELLMOD_CRITICAL_CHANCE
Definition: SpellDefines.h:84
@ SPELL_ATTR2_CANT_CRIT
Definition: SharedDefines.h:485

References BASE_ATTACK, SpellInfo::DmgClass, GetFirstSchoolInMask(), Object::GetFloatValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), Object::GetTypeId(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsCritCapable(), Object::IsPlayer(), m_baseSpellCritChance, OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, SPELL_AURA_MOD_WEAPON_CRIT_PERCENT, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_CRITICAL_CHANCE, and TYPEID_UNIT.

Referenced by Spell::DoAllEffectOnLaunchTarget().

◆ SpellHealingBonusDone()

uint32 Unit::SpellHealingBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
12374{
12375 // For totems get healing bonus from owner (statue isn't totem in fact)
12376 if (GetTypeId() == TYPEID_UNIT && IsTotem())
12377 if (Unit* owner = GetOwner())
12378 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack);
12379
12380 // No bonus healing for potion spells
12381 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12382 return healamount;
12383
12384 float ApCoeffMod = 1.0f;
12385 float DoneTotalMod = TotalMod ? TotalMod : SpellPctHealingModsDone(victim, spellProto, damagetype);
12386 int32 DoneTotal = 0;
12387
12388 // done scripted mod (take it from owner)
12389 Unit* owner = GetOwner() ? GetOwner() : this;
12390 int32 DoneAdvertisedBenefit = 0;
12391 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12392 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12393 {
12394 if (!(*i)->IsAffectedOnSpell(spellProto))
12395 continue;
12396
12397 switch ((*i)->GetMiscValue())
12398 {
12399 case 4415: // Increased Rejuvenation Healing
12400 case 4953:
12401 DoneAdvertisedBenefit += (*i)->GetAmount();
12402 break;
12403 case 3736: // Hateful Totem of the Third Wind / Increased Lesser Healing Wave / LK Arena (4/5/6) Totem of the Third Wind / Savage Totem of the Third Wind
12404 DoneAdvertisedBenefit += (*i)->GetAmount();
12405 break;
12406 }
12407 }
12408
12409 switch (spellProto->SpellFamilyName)
12410 {
12412 {
12413 // Impurity
12415 {
12416 AddPct(ApCoeffMod, aurEff->GetAmount());
12417 }
12418 break;
12419 }
12420 default:
12421 break;
12422 }
12423
12424 // Done fixed damage bonus auras
12425 DoneAdvertisedBenefit += SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
12426 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
12427
12428 // Check for table values
12429 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12430 if(bonus)
12431 {
12432 if (damagetype == DOT)
12433 {
12434 coeff = bonus->dot_damage;
12435 if (bonus->ap_dot_bonus > 0)
12436 DoneTotal += int32(bonus->ap_dot_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12437 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12438 }
12439 else
12440 {
12441 coeff = bonus->direct_damage;
12442 if (bonus->ap_bonus > 0)
12443 DoneTotal += int32(bonus->ap_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12444 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12445 }
12446 }
12447 else
12448 {
12449 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12450 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12451 return healamount;
12452 }
12453
12454 // Default calculation
12455 if (DoneAdvertisedBenefit)
12456 {
12457 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12458 if (Player* modOwner = GetSpellModOwner())
12459 {
12460 coeff *= 100.0f;
12461 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12462 coeff /= 100.0f;
12463 }
12464 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
12465 }
12466
12467 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12468 {
12469 switch (spellProto->Effects[i].ApplyAuraName)
12470 {
12471 // Bonus healing does not apply to these spells
12474 DoneTotal = 0;
12475 break;
12476 }
12477 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12478 DoneTotal = 0;
12479 }
12480
12481 // use float as more appropriate for negative values and percent applying
12482 float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
12483 // apply spellmod to Done amount
12484
12485 if (Player* modOwner = GetSpellModOwner())
12486 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
12487
12488 return uint32(std::max(heal, 0.0f));
12489}
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
Definition: SpellAuraDefines.h:125
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12623
float SpellPctHealingModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition: Unit.cpp:12281

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAttackPowerValue(), Object::GetTypeId(), SpellInfo::Id, SpellInfo::IsRangedWeaponSpell(), IsTotem(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_POTION, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctHealingModsDone(), sSpellMgr, and TYPEID_UNIT.

Referenced by AuraEffect::CalculateAmount(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_dru_lifebloom::HandleDispel(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHealingBonusTaken()

uint32 Unit::SpellHealingBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint32  stack = 1 
)
12492{
12493 float TakenTotalMod = 1.0f;
12494 float minval = 0.0f;
12495
12496 // Healing taken percent
12497 if (!sScriptMgr->OnSpellHealingBonusTakenNegativeModifiers(this, caster, spellProto, minval))
12498 {
12500 }
12501
12502 if (minval)
12503 AddPct(TakenTotalMod, minval);
12504
12506 if (maxval)
12507 AddPct(TakenTotalMod, maxval);
12508
12509 // Tenacity increase healing % taken
12510 if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0))
12511 AddPct(TakenTotalMod, Tenacity->GetAmount());
12512
12513 // Healing Done
12514 int32 TakenTotal = 0;
12515
12516 // Taken fixed damage bonus auras
12517 int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
12518
12519 // Nourish cast, glyph of nourish
12520 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000 && caster)
12521 {
12522 bool any = false;
12523 bool hasglyph = caster->GetAuraEffectDummy(62971);
12525 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
12526 {
12527 if (((*i)->GetCasterGUID() == caster->GetGUID()))
12528 {
12529 SpellInfo const* spell = (*i)->GetSpellInfo();
12530 // Rejuvenation, Regrowth, Lifebloom, or Wild Growth
12531 if (!any && spell->SpellFamilyFlags.HasFlag(0x50, 0x4000010, 0))
12532 {
12533 TakenTotalMod *= 1.2f;
12534 any = true;
12535 }
12536
12537 if (hasglyph)
12538 TakenTotalMod += 0.06f;
12539 }
12540 }
12541 }
12542
12543 if (damagetype == DOT)
12544 {
12545 // Healing over time taken percent
12546 float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12547 if (minval_hot)
12548 AddPct(TakenTotalMod, minval_hot);
12549
12550 float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12551 if (maxval_hot)
12552 AddPct(TakenTotalMod, maxval_hot);
12553 }
12554
12555 // Check for table values
12556 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12557 float coeff = 0;
12558 float factorMod = 1.0f;
12559 if (bonus)
12560 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12561 else
12562 {
12563 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12564 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12565 {
12566 healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
12567 return healamount;
12568 }
12569 }
12570
12571 // Default calculation
12572 if (TakenAdvertisedBenefit)
12573 {
12574 float TakenCoeff = 0.0f;
12575 if (coeff <= 0)
12576 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells)
12577
12578 factorMod *= CalculateLevelPenalty(spellProto) * int32(stack);
12579 if (Player* modOwner = GetSpellModOwner())
12580 {
12581 coeff *= 100.0f;
12582 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12583 coeff /= 100.0f;
12584 }
12585
12586 TakenTotal += int32(TakenAdvertisedBenefit * (coeff > 0 ? coeff : TakenCoeff) * factorMod);
12587 }
12588
12589 if (caster)
12590 {
12592 for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
12593 if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto))
12594 AddPct(TakenTotalMod, (*i)->GetAmount());
12595 }
12596
12597 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12598 {
12599 switch (spellProto->Effects[i].ApplyAuraName)
12600 {
12601 // Bonus healing does not apply to these spells
12604 TakenTotal = 0;
12605 break;
12606 }
12607 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12608 TakenTotal = 0;
12609 }
12610
12611 // No positive taken bonus, custom attr
12612 if ((spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS)) && TakenTotalMod > 1.0f)
12613 {
12614 TakenTotal = 0;
12615 TakenTotalMod = 1.0f;
12616 }
12617
12618 float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
12619
12620 return uint32(std::max(heal, 0.0f));
12621}
@ SPELL_AURA_MOD_HEALING_RECEIVED
Definition: SpellAuraDefines.h:346
@ SPELL_AURA_MOD_HEALING_PCT
Definition: SpellAuraDefines.h:181
@ SPELL_AURA_MOD_HOT_PCT
Definition: SpellAuraDefines.h:322
@ SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS
Definition: SharedDefines.h:631
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition: Unit.cpp:5879
int32 GetMaxNegativeAuraModifier(AuraType auratype) const
Definition: Unit.cpp:5893
int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask)
Definition: Unit.cpp:12656

References AddPct(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, GetAuraEffect(), GetAuraEffectDummy(), GetAuraEffectsByType(), Object::GetGUID(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), SpellInfo::GetSchoolMask(), flag96::HasFlag(), SpellInfo::Id, SPELL_AURA_MOD_HEALING_PCT, SPELL_AURA_MOD_HOT_PCT, SPELL_AURA_PERIODIC_HEAL, SPELL_DAMAGE_CLASS_NONE, SpellBaseHealingBonusTaken(), SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sScriptMgr, and sSpellMgr.

Referenced by spell_dru_lifebloom::AfterRemove(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_pri_renew::HandleApplyEffect(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHitResult() [1/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
Spell const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3496{
3497 SpellInfo const* spellInfo = spell->GetSpellInfo();
3498
3499 // Check for immune
3500 if (victim->IsImmunedToSpell(spellInfo, spell))
3501 {
3502 return SPELL_MISS_IMMUNE;
3503 }
3504
3505 // All positive spells can`t miss
3507 if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
3508 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3509 {
3510 return SPELL_MISS_NONE;
3511 }
3512
3513 // Check for immune
3514 // xinef: check for school immunity only
3515 if (victim->IsImmunedToSchool(spell))
3516 {
3517 return SPELL_MISS_IMMUNE;
3518 }
3519
3520 if (this == victim)
3521 {
3522 return SPELL_MISS_NONE;
3523 }
3524
3525 // Return evade for units in evade mode
3526 if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) &&
3528 {
3529 return SPELL_MISS_EVADE;
3530 }
3531
3532 // Try victim reflect spell
3533 if (CanReflect)
3534 {
3535 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3536 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3537 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3538 {
3539 if ((*i)->GetMiscValue() & spell->GetSpellSchoolMask())
3540 {
3541 reflectchance += (*i)->GetAmount();
3542 }
3543 }
3544
3545 if (reflectchance > 0 && roll_chance_i(reflectchance))
3546 {
3547 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3548 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3549 return SPELL_MISS_REFLECT;
3550 }
3551 }
3552
3553 switch (spellInfo->DmgClass)
3554 {
3557 return MeleeSpellHitResult(victim, spellInfo);
3559 {
3560 if (spellInfo->SpellFamilyName)
3561 {
3562 return SPELL_MISS_NONE;
3563 }
3564
3565 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3566 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3567 {
3568 if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3569 {
3570 if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3571 {
3572 return SPELL_MISS_NONE;
3573 }
3574 }
3575 }
3576 [[fallthrough]];
3577 }
3579 return MagicSpellHitResult(victim, spellInfo);
3580 }
3581
3582 return SPELL_MISS_NONE;
3583}
@ SPELL_AURA_REFLECT_SPELLS
Definition: SpellAuraDefines.h:91
@ SPELL_EFFECT_DISPEL
Definition: SharedDefines.h:816
@ SPELL_MISS_IMMUNE
Definition: SharedDefines.h:1526
@ SPELL_MISS_EVADE
Definition: SharedDefines.h:1525
@ SPELL_MISS_REFLECT
Definition: SharedDefines.h:1530
SpellMissInfo MagicSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition: Unit.cpp:3287
SpellMissInfo MeleeSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition: Unit.cpp:3114
uint32 DmgClass
Definition: SpellInfo.h:389

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), GetTotalAuraModifier(), Object::GetTypeId(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, Object::ToCreature(), and TYPEID_UNIT.

◆ SpellHitResult() [2/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
SpellInfo const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3431{
3432 // Check for immune
3433 if (victim->IsImmunedToSpell(spell))
3434 return SPELL_MISS_IMMUNE;
3435
3436 // All positive spells can`t miss
3438 if ((spell->IsPositive() || spell->HasEffect(SPELL_EFFECT_DISPEL))
3439 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3440 return SPELL_MISS_NONE;
3441
3442 // Check for immune
3443 // xinef: check for school immunity only
3444 if (victim->IsImmunedToSchool(spell))
3445 return SPELL_MISS_IMMUNE;
3446
3447 if (this == victim)
3448 return SPELL_MISS_NONE;
3449
3450 // Return evade for units in evade mode
3451 if (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE)
3452 && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT))
3453 return SPELL_MISS_EVADE;
3454
3455 // Try victim reflect spell
3456 if (CanReflect)
3457 {
3458 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3459 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3460 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3461 if ((*i)->GetMiscValue() & spell->GetSchoolMask())
3462 reflectchance += (*i)->GetAmount();
3463 if (reflectchance > 0 && roll_chance_i(reflectchance))
3464 {
3465 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3466 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3467 return SPELL_MISS_REFLECT;
3468 }
3469 }
3470
3471 switch (spell->DmgClass)
3472 {
3475 return MeleeSpellHitResult(victim, spell);
3477 {
3478 if (spell->SpellFamilyName)
3479 {
3480 return SPELL_MISS_NONE;
3481 }
3482 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3483 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3484 if (spell->Effects[i].Effect && spell->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3485 if (spell->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3486 return SPELL_MISS_NONE;
3487 [[fallthrough]];
3488 }
3490 return MagicSpellHitResult(victim, spell);
3491 }
3492 return SPELL_MISS_NONE;
3493}

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), GetTotalAuraModifier(), Object::GetTypeId(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, Object::ToCreature(), and TYPEID_UNIT.

Referenced by Spell::AddUnitTarget(), DealMeleeDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SpellPctDamageModsDone()

float Unit::SpellPctDamageModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
11206{
11207 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11208 return 1.0f;
11209
11210 // Some spells don't benefit from done mods
11211 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11212 return 1.0f;
11213
11214 // For totems get damage bonus from owner
11215 if (GetTypeId() == TYPEID_UNIT)
11216 {
11217 if (IsTotem())
11218 {
11219 if (Unit* owner = GetOwner())
11220 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11221 }
11222 // Dancing Rune Weapon...
11223 else if (GetEntry() == 27893)
11224 {
11225 if (Unit* owner = GetOwner())
11226 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11227 }
11228 }
11229
11230 // Done total percent damage auras
11231 float DoneTotalMod = 1.0f;
11232
11234 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
11235 {
11236 // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
11237 if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1 &&
11238 !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL)
11239 {
11240 continue;
11241 }
11242
11243 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11244 continue;
11245
11246 if (!sScriptMgr->IsNeedModSpellDamagePercent(this, *i, DoneTotalMod, spellProto))
11247 continue;
11248
11249 if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
11250 {
11251 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
11252 AddPct(DoneTotalMod, (*i)->GetAmount());
11253 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
11254 AddPct(DoneTotalMod, (*i)->GetAmount());
11255 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
11256 AddPct(DoneTotalMod, (*i)->GetAmount());
11257 }
11258 }
11259
11260 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11262 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
11263 if ((creatureTypeMask & uint32((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11264 AddPct(DoneTotalMod, (*i)->GetAmount());
11265
11266 // bonus against aurastate
11268 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
11269 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11270 AddPct(DoneTotalMod, (*i)->GetAmount());
11271
11272 // done scripted mod (take it from owner)
11273 Unit* owner = GetOwner() ? GetOwner() : this;
11274 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11275 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11276 {
11277 // Xinef: self cast is ommited (because of Rage of Rivendare)
11278 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11279 continue;
11280
11281 // xinef: Molten Fury should work on all spells
11282 switch ((*i)->GetMiscValue())
11283 {
11284 case 4920: // Molten Fury
11285 case 4919:
11286 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11287 AddPct(DoneTotalMod, (*i)->GetAmount());
11288 break;
11289 }
11290
11291 if (!(*i)->IsAffectedOnSpell(spellProto))
11292 continue;
11293
11294 switch ((*i)->GetMiscValue())
11295 {
11296 case 6917: // Death's Embrace
11297 case 6926:
11298 case 6928:
11299 {
11300 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11301 AddPct(DoneTotalMod, (*i)->GetAmount());
11302 break;
11303 }
11304 // Soul Siphon
11305 case 4992:
11306 case 4993:
11307 {
11308 // effect 1 m_amount
11309 int32 maxPercent = (*i)->GetAmount();
11310 // effect 0 m_amount
11311 int32 stepPercent = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 0);
11312 // count affliction effects and calc additional damage in percentage
11313 int32 modPercent = 0;
11314 AuraApplicationMap const& victimAuras = victim->GetAppliedAuras();
11315 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
11316 {
11317 Aura const* aura = itr->second->GetBase();
11318 SpellInfo const* m_spell = aura->GetSpellInfo();
11319 if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
11320 continue;
11321 modPercent += stepPercent * aura->GetStackAmount();
11322 if (modPercent >= maxPercent)
11323 {
11324 modPercent = maxPercent;
11325 break;
11326 }
11327 }
11328 AddPct(DoneTotalMod, modPercent);
11329 break;
11330 }
11331 case 6916: // Death's Embrace
11332 case 6925:
11333 case 6927:
11334 if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, spellProto, this))
11335 AddPct(DoneTotalMod, (*i)->GetAmount());
11336 break;
11337 case 5481: // Starfire Bonus
11338 {
11339 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002, 0, 0))
11340 AddPct(DoneTotalMod, (*i)->GetAmount());
11341 break;
11342 }
11343 // Tundra Stalker
11344 // Merciless Combat
11345 case 7277:
11346 {
11347 // Merciless Combat
11348 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
11349 {
11350 if( (spellProto && spellProto->SpellFamilyFlags[0] & 0x2) || spellProto->SpellFamilyFlags[1] & 0x2 )
11351 if (!victim->HealthAbovePct(35))
11352 AddPct(DoneTotalMod, (*i)->GetAmount());
11353 }
11354 // Tundra Stalker
11355 else
11356 {
11357 // Frost Fever (target debuff)
11358 if (victim->HasAura(55095))
11359 AddPct(DoneTotalMod, (*i)->GetAmount());
11360 break;
11361 }
11362 break;
11363 }
11364 // Rage of Rivendare
11365 case 7293:
11366 {
11368 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
11369 break;
11370 }
11371 // Twisted Faith
11372 case 7377:
11373 {
11375 AddPct(DoneTotalMod, (*i)->GetAmount());
11376 break;
11377 }
11378 // Marked for Death
11379 case 7598:
11380 case 7599:
11381 case 7600:
11382 case 7601:
11383 case 7602:
11384 {
11385 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
11386 AddPct(DoneTotalMod, (*i)->GetAmount());
11387 break;
11388 }
11389 // Dirty Deeds
11390 case 6427:
11391 case 6428:
11392 case 6579:
11393 case 6580:
11394 {
11395 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11396 {
11397 // effect 0 has expected value but in negative state
11398 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
11399 AddPct(DoneTotalMod, bonus);
11400 }
11401 break;
11402 }
11403 }
11404 }
11405
11406 // Custom scripted damage
11407 switch (spellProto->SpellFamilyName)
11408 {
11409 case SPELLFAMILY_MAGE:
11410 // Ice Lance
11411 if (spellProto->SpellIconID == 186)
11412 {
11413 if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this))
11414 {
11415 // Glyph of Ice Lance
11416 if (owner->HasAura(56377) && victim->GetLevel() > owner->GetLevel())
11417 DoneTotalMod *= 4.0f;
11418 else
11419 DoneTotalMod *= 3.0f;
11420 }
11421 }
11422
11423 // Torment the weak
11424 if (spellProto->SpellFamilyFlags[0] & 0x20600021 || spellProto->SpellFamilyFlags[1] & 0x9000)
11425 if (victim->HasAuraWithMechanic((1 << MECHANIC_SNARE) | (1 << MECHANIC_SLOW_ATTACK)))
11427 AddPct(DoneTotalMod, aurEff->GetAmount());
11428 break;
11429 case SPELLFAMILY_PRIEST:
11430 // Mind Flay
11431 if (spellProto->SpellFamilyFlags[0] & 0x800000)
11432 {
11433 // Glyph of Shadow Word: Pain
11434 if (AuraEffect* aurEff = GetAuraEffect(55687, 0))
11435 // Increase Mind Flay damage if Shadow Word: Pain present on target
11437 AddPct(DoneTotalMod, aurEff->GetAmount());
11438
11439 // Twisted Faith - Mind Flay part
11441 // Increase Mind Flay damage if Shadow Word: Pain present on target
11443 AddPct(DoneTotalMod, aurEff->GetAmount());
11444 }
11445 // Smite
11446 else if (spellProto->SpellFamilyFlags[0] & 0x80)
11447 {
11448 // Glyph of Smite
11449 if (AuraEffect* aurEff = GetAuraEffect(55692, 0))
11450 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x100000, 0, 0, GetGUID()))
11451 AddPct(DoneTotalMod, aurEff->GetAmount());
11452 }
11453 // Shadow Word: Death
11454 else if (spellProto->SpellFamilyFlags[1] & 0x2)
11455 {
11456 // Glyph of Shadow Word: Death
11457 if (AuraEffect* aurEff = GetAuraEffect(55682, 1))
11459 AddPct(DoneTotalMod, aurEff->GetAmount());
11460 }
11461
11462 break;
11464 // Judgement of Vengeance/Judgement of Corruption
11465 if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
11466 {
11467 // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
11468 uint32 stacks = 0;
11470 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
11471 if (((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID() == GetGUID())
11472 {
11473 stacks = (*itr)->GetBase()->GetStackAmount();
11474 break;
11475 }
11476 // + 10% for each application of Holy Vengeance/Blood Corruption on the target
11477 if (stacks)
11478 AddPct(DoneTotalMod, 10 * stacks);
11479 }
11480 break;
11481 case SPELLFAMILY_DRUID:
11482 // Thorns
11483 if (spellProto->SpellFamilyFlags[0] & 0x100)
11484 {
11485 // Brambles
11486 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
11487 AddPct(DoneTotalMod, aurEff->GetAmount());
11488 }
11489 break;
11491 // Fire and Brimstone
11492 if (spellProto->SpellFamilyFlags[1] & 0x00020040)
11494 {
11496 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
11497 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
11498 {
11499 AddPct(DoneTotalMod, (*i)->GetAmount());
11500 break;
11501 }
11502 }
11503 // Drain Soul - increased damage for targets under 25 % HP
11504 if (spellProto->SpellFamilyFlags[0] & 0x00004000)
11505 if (!victim->HealthAbovePct(25))
11506 DoneTotalMod *= 4;
11507 // Shadow Bite (15% increase from each dot)
11508 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && IsPet())
11509 if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
11510 AddPct(DoneTotalMod, 15 * count);
11511 break;
11512 case SPELLFAMILY_HUNTER:
11513 // Steady Shot
11514 if (spellProto->SpellFamilyFlags[1] & 0x1)
11515 if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
11516 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
11517 AddPct(DoneTotalMod, aurEff->GetAmount());
11518 break;
11520 // Improved Icy Touch
11521 if (spellProto->SpellFamilyFlags[0] & 0x2)
11523 AddPct(DoneTotalMod, aurEff->GetAmount());
11524
11525 // Glacier Rot
11526 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
11528 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
11529 AddPct(DoneTotalMod, aurEff->GetAmount());
11530 break;
11531 }
11532
11533 return DoneTotalMod;
11534}
@ MECHANIC_SLOW_ATTACK
Definition: SharedDefines.h:1333
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition: SharedDefines.h:1293
@ AURA_STATE_CONFLAGRATE
Definition: SharedDefines.h:1306
uint32 GetDiseasesByCaster(ObjectGuid casterGUID, uint8 mode=0)
Definition: Unit.cpp:5765
bool HasAuraWithMechanic(uint32 mechanicMask) const
Definition: Unit.cpp:5736
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition: Unit.cpp:5452
uint32 GetDoTsByCaster(ObjectGuid casterGUID) const
Definition: Unit.cpp:5811

References AddPct(), AURA_STATE_CONFLAGRATE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, CalculateSpellDamage(), DIRECT_DAMAGE, DOT, EFFECT_0, SpellInfo::EquippedItemClass, GetAppliedAuras(), GetAuraEffect(), GetAuraEffectOfRankedSpell(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDoTsByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetLevel(), GetOwner(), GetOwnerGUID(), SpellInfo::GetSchoolMask(), Aura::GetSpellInfo(), Aura::GetStackAmount(), Object::GetTypeId(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), HealthAbovePct(), IsPet(), IsTotem(), MECHANIC_SLOW_ATTACK, MECHANIC_SNARE, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPED_ITEM, SPELL_AURA_DUMMY, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sScriptMgr, Object::ToPlayer(), TYPEID_UNIT, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by AuraEffect::CalculatePeriodicData(), and SpellDamageBonusDone().

◆ SpellPctHealingModsDone()

float Unit::SpellPctHealingModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
12282{
12283 // For totems get healing bonus from owner (statue isn't totem in fact)
12284 if (GetTypeId() == TYPEID_UNIT && IsTotem())
12285 if (Unit* owner = GetOwner())
12286 return owner->SpellPctHealingModsDone(victim, spellProto, damagetype);
12287
12288 // Some spells don't benefit from done mods
12289 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
12290 return 1.0f;
12291
12292 // xinef: Some spells don't benefit from done mods
12293 if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS))
12294 return 1.0f;
12295
12296 // No bonus healing for potion spells
12297 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12298 return 1.0f;
12299
12300 float DoneTotalMod = 1.0f;
12301
12302 // Healing done percent
12304 for (auto const& auraEff : mHealingDonePct)
12305 {
12306 if (!sScriptMgr->IsNeedModHealPercent(this, auraEff, DoneTotalMod, spellProto))
12307 continue;
12308
12309 AddPct(DoneTotalMod, auraEff->GetAmount());
12310 }
12311
12312 // done scripted mod (take it from owner)
12313 Unit* owner = GetOwner() ? GetOwner() : this;
12314 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12315 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12316 {
12317 if (!(*i)->IsAffectedOnSpell(spellProto))
12318 continue;
12319
12320 switch ((*i)->GetMiscValue())
12321 {
12322 case 21: // Test of Faith
12323 case 6935:
12324 case 6918:
12325 if (victim->HealthBelowPct(50))
12326 AddPct(DoneTotalMod, (*i)->GetAmount());
12327 break;
12328 case 7798: // Glyph of Regrowth
12329 {
12331 AddPct(DoneTotalMod, (*i)->GetAmount());
12332 break;
12333 }
12334
12335 case 7871: // Glyph of Lesser Healing Wave
12336 {
12337 // xinef: affected by any earth shield
12338 if (victim->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0, 0x00000400, 0))
12339 AddPct(DoneTotalMod, (*i)->GetAmount());
12340 break;
12341 }
12342 default:
12343 break;
12344 }
12345 }
12346
12347 switch (spellProto->SpellFamilyName)
12348 {
12350 // Talents and glyphs for healing stream totem
12351 if (spellProto->Id == 52042)
12352 {
12353 // Glyph of Healing Stream Totem
12354 if (AuraEffect* dummy = owner->GetAuraEffect(55456, EFFECT_0))
12355 AddPct(DoneTotalMod, dummy->GetAmount());
12356
12357 // Healing Stream totem - Restorative Totems
12358 if (AuraEffect* aurEff = GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 338, 1))
12359 AddPct(DoneTotalMod, aurEff->GetAmount());
12360 }
12361 break;
12362 case SPELLFAMILY_PRIEST:
12363 // T9 HEALING 4P, empowered renew instant heal
12364 if (spellProto->Id == 63544)
12365 if (AuraEffect* aurEff = GetAuraEffect(67202, EFFECT_0))
12366 AddPct(DoneTotalMod, aurEff->GetAmount());
12367 break;
12368 }
12369
12370 return DoneTotalMod;
12371}
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
Definition: SpellAuraDefines.h:199

References AddPct(), EFFECT_0, GetAuraEffect(), GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), Object::GetTypeId(), SpellInfo::HasAttribute(), HealthBelowPct(), SpellInfo::Id, IsTotem(), SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_DUMMY, SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SpellInfo::SpellFamilyName, sScriptMgr, and TYPEID_UNIT.

Referenced by AuraEffect::CalculatePeriodicData(), and SpellHealingBonusDone().

◆ SpellTakenCritChance()

float Unit::SpellTakenCritChance ( Unit const *  caster,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
float  doneChance,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
11991{
11992 // not critting spell
11993 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
11994 return 0.0f;
11995
11996 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
11997 if (!skipEffectCheck && !spellProto->IsCritCapable())
11998 return 0.0f;
11999
12000 float crit_chance = doneChance;
12001 switch (spellProto->DmgClass)
12002 {
12004 {
12005 if (!spellProto->IsPositive())
12006 {
12007 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
12008 // xinef: apply max and min only
12010 {
12013 }
12014
12015 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_SPELL);
12016 }
12017 // scripted (increase crit chance ... against ... target by x%
12018 if (caster)
12019 {
12020 AuraEffectList const& mOverrideClassScript = caster->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12021 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12022 {
12023 if (!((*i)->IsAffectedOnSpell(spellProto)))
12024 continue;
12025 int32 modChance = 0;
12026 switch ((*i)->GetMiscValue())
12027 {
12028 // Shatter
12029 case 911:
12030 modChance += 16;
12031 [[fallthrough]];
12032 case 910:
12033 modChance += 17;
12034 [[fallthrough]];
12035 case 849:
12036 modChance += 17;
12037 if (!HasAuraState(AURA_STATE_FROZEN, spellProto, caster))
12038 break;
12039 crit_chance += modChance;
12040 break;
12041 case 7917: // Glyph of Shadowburn
12042 if (HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, caster))
12043 crit_chance += (*i)->GetAmount();
12044 break;
12045 case 7997: // Renewed Hope
12046 case 7998:
12047 if (HasAura(6788))
12048 crit_chance += (*i)->GetAmount();
12049 break;
12050 default:
12051 break;
12052 }
12053 }
12054 // Custom crit by class
12055 switch (spellProto->SpellFamilyName)
12056 {
12057 case SPELLFAMILY_MAGE:
12058 // Glyph of Fire Blast
12059 if (spellProto->SpellFamilyFlags[0] == 0x2 && spellProto->SpellIconID == 12)
12061 if (AuraEffect const* aurEff = caster->GetAuraEffect(56369, EFFECT_0))
12062 crit_chance += aurEff->GetAmount();
12063 break;
12064 case SPELLFAMILY_DRUID:
12065 // Improved Faerie Fire
12067 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 109, 0))
12068 crit_chance += aurEff->GetAmount();
12069
12070 // cumulative effect - don't break
12071
12072 // Starfire
12073 if (spellProto->SpellFamilyFlags[0] & 0x4 && spellProto->SpellIconID == 1485)
12074 {
12075 // Improved Insect Swarm
12076 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 1771, 0))
12078 crit_chance += aurEff->GetAmount();
12079 break;
12080 }
12081 break;
12082 case SPELLFAMILY_ROGUE:
12083 // Shiv-applied poisons can't crit
12084 if (caster->FindCurrentSpellBySpellId(5938))
12085 crit_chance = 0.0f;
12086 break;
12088 // Flash of light
12089 if (spellProto->SpellFamilyFlags[0] & 0x40000000)
12090 {
12091 // Sacred Shield
12092 if (AuraEffect const* aura = GetAuraEffect(58597, 1, GetGUID()))
12093 crit_chance += aura->GetAmount();
12094 break;
12095 }
12096 // Exorcism
12097 else if (spellProto->GetCategory() == 19)
12098 {
12100 return 100.0f;
12101 break;
12102 }
12103 break;
12104 case SPELLFAMILY_SHAMAN:
12105 // Lava Burst
12106 if (spellProto->SpellFamilyFlags[1] & 0x00001000)
12107 {
12108 if (GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0, 0, caster->GetGUID()))
12110 return 100.0f;
12111 break;
12112 }
12113 break;
12114 }
12115 }
12116 break;
12117 }
12119 // Custom crit by class
12120 if (caster)
12121 {
12122 switch (spellProto->SpellFamilyName)
12123 {
12124 case SPELLFAMILY_DRUID:
12125 // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets
12126 if (spellProto->SpellFamilyFlags[0] & 0x00800000 && spellProto->SpellIconID == 1680 && HasAuraState(AURA_STATE_BLEEDING))
12127 {
12128 if (AuraEffect const* rendAndTear = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1))
12129 crit_chance += rendAndTear->GetAmount();
12130 break;
12131 }
12132 break;
12134 // Victory Rush
12135 if (spellProto->SpellFamilyFlags[1] & 0x100)
12136 {
12137 // Glyph of Victory Rush
12138 if (AuraEffect const* aurEff = caster->GetAuraEffect(58382, 0))
12139 crit_chance += aurEff->GetAmount();
12140 break;
12141 }
12142 break;
12143 }
12144 }
12145
12146 // 100% critical chance against sitting target
12148 {
12149 return 100.0f;
12150 }
12151 [[fallthrough]];
12153 {
12154 // flat aura mods
12155 if (attackType == RANGED_ATTACK)
12157 else
12159
12160 // reduce crit chance from Rating for players
12161 if (attackType != RANGED_ATTACK)
12162 {
12163 // xinef: little hack, crit chance dont require caster to calculate, pass victim
12164 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_MELEE);
12165 }
12166 else
12167 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_RANGED);
12168
12169 // Apply crit chance from defence skill
12170 if (caster)
12171 crit_chance += (int32(caster->GetMaxSkillValueForLevel(this)) - int32(GetDefenseSkillValue(caster))) * 0.04f;
12172
12173 break;
12174 }
12175 // values overridden in spellmgr for lifebloom and earth shield
12177 default:
12178 return 0.0f;
12179 }
12180
12181 if (caster)
12182 {
12184 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
12185 {
12186 if (caster->GetGUID() != (*i)->GetCasterGUID())
12187 continue;
12188
12189 crit_chance += (*i)->GetAmount();
12190 }
12191 }
12192
12193 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
12194 // xinef: should be calculated at the end
12195 if (!spellProto->IsPositive())
12197
12198 // xinef: can be negative!
12199 return crit_chance;
12200}
@ SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
Definition: SpellAuraDefines.h:242
uint32 const CREATURE_TYPEMASK_DEMON_OR_UNDEAD
Definition: SharedDefines.h:2643
@ MECHANIC_KNOCKOUT
Definition: SharedDefines.h:1339
@ AURA_STATE_BLEEDING
Definition: SharedDefines.h:1310
@ AURA_STATE_FAERIE_FIRE
Definition: SharedDefines.h:1304
int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
Definition: Unit.cpp:5930
int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition: Unit.cpp:5944

References ApplyResilience(), AURA_STATE_BLEEDING, AURA_STATE_FAERIE_FIRE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_35_PERCENT, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CREATURE_TYPEMASK_DEMON_OR_UNDEAD, SpellInfo::DmgClass, EFFECT_0, FindCurrentSpellBySpellId(), GetAuraEffect(), GetAuraEffectsByType(), SpellInfo::GetCategory(), GetCreatureTypeMask(), GetDefenseSkillValue(), GetDummyAuraEffect(), Object::GetGUID(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxSkillValueForLevel(), getStandState(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraType(), HasAuraWithMechanic(), SpellInfo::IsCritCapable(), Object::IsPlayer(), SpellInfo::IsPositive(), IsSitState(), MECHANIC_KNOCKOUT, MECHANIC_STUN, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLFAMILY_DRUID, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, and UNIT_STAND_STATE_SLEEP.

Referenced by AuraEffect::CalcPeriodicCritChance(), and Spell::DoAllEffectOnLaunchTarget().

◆ StartReactiveTimer()

void Unit::StartReactiveTimer ( ReactiveType  reactive)
inline
#define REACTIVE_TIMER_START
Definition: Unit.h:584

References m_reactiveTimer, and REACTIVE_TIMER_START.

Referenced by ProcDamageAndSpellFor().

◆ StopAttackFaction()

void Unit::StopAttackFaction ( uint32  faction_id)
20073{
20074 if (Unit* victim = GetVictim())
20075 {
20076 if (victim->GetFactionTemplateEntry()->faction == faction_id)
20077 {
20078 AttackStop();
20079 if (IsNonMeleeSpellCast(false))
20081
20082 // melee and ranged forced attack cancel
20083 if (IsPlayer())
20085 }
20086 }
20087
20088 AttackerSet const& attackers = getAttackers();
20089 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20090 {
20091 if ((*itr)->GetFactionTemplateEntry()->faction == faction_id)
20092 {
20093 (*itr)->AttackStop();
20094 itr = attackers.begin();
20095 }
20096 else
20097 ++itr;
20098 }
20099
20101
20102 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20103 (*itr)->StopAttackFaction(faction_id);
20104}
void deleteReferencesForFaction(uint32 faction)
Definition: HostileRefMgr.cpp:162

References AttackStop(), HostileRefMgr::deleteReferencesForFaction(), getAttackers(), getHostileRefMgr(), GetVictim(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by AuraEffect::HandleForceReaction().

◆ StopAttackingInvalidTarget()

void Unit::StopAttackingInvalidTarget ( )
20107{
20108 AttackerSet const& attackers = getAttackers();
20109 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20110 {
20111 Unit* attacker = (*itr);
20112 if (!attacker->IsValidAttackTarget(this))
20113 {
20114 attacker->AttackStop();
20115 if (attacker->IsPlayer())
20116 {
20118 }
20119
20120 for (Unit* controled : attacker->m_Controlled)
20121 {
20122 if (controled->GetVictim() == this && !controled->IsValidAttackTarget(this))
20123 {
20124 controled->AttackStop();
20125 }
20126 }
20127
20128 itr = attackers.begin();
20129 }
20130 else
20131 {
20132 ++itr;
20133 }
20134 }
20135}

References AttackStop(), getAttackers(), GetVictim(), Object::IsPlayer(), IsValidAttackTarget(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by RemoveCharmedBy(), and SetCharmedBy().

◆ StopMoving()

void Unit::StopMoving ( )
16565{
16567
16568 // not need send any packets if not in world or not moving
16569 if (!IsInWorld())
16570 return;
16571
16572 if (movespline->Finalized())
16573 return;
16574
16575 // Update position now since Stop does not start a new movement that can be updated later
16576 if (movespline->HasStarted())
16578
16579 Movement::MoveSplineInit init(this);
16580 init.Stop();
16581}
void UpdateSplinePosition()
Definition: Unit.cpp:608
bool HasStarted() const
Definition: MoveSpline.h:129

References ClearUnitState(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::HasStarted(), Object::IsInWorld(), movespline, Movement::MoveSplineInit::Stop(), UNIT_STATE_MOVING, and UpdateSplinePosition().

Referenced by npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI::DamageTaken(), npc_vrykul_skeleton::npc_vrykul_skeletonAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), ScriptedAI::DoCastSpell(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), ChaseMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), WorldSession::HandlePetActionHelper(), RotateMovementGenerator::Initialize(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_kologarn::boss_kologarnAI::JustDied(), boss_swamplord_muselek::JustEngagedWith(), Player::LeaveBattleground(), SmartAI::MoveAway(), boss_headless_horseman::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), PauseMovement(), SmartAI::PausePath(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), RemoveCharmedBy(), Creature::RemoveCorpse(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), boss_leotheras_the_blind::Reset(), IdleMovementGenerator::Reset(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_victor_nefarius::boss_victor_nefariusAI::SetData(), setDeathState(), SetFeared(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), SetRooted(), npc_magister_aledis::sGossipSelect(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), SmartAI::StopFollow(), SmartAI::StopPath(), CreatureAI::TriggerAlert(), Pet::Update(), TimedFleeingMovementGenerator::Update(), boss_felblood_kaelthas::UpdateAI(), boss_felmyst::boss_felmystAI::UpdateAI(), boss_akilzon::boss_akilzonAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), and PetAI::UpdateAI().

◆ StopMovingOnCurrentPos()

void Unit::StopMovingOnCurrentPos ( )
16604{
16606
16607 // not need send any packets if not in world
16608 if (!IsInWorld())
16609 return;
16610
16611 DisableSpline(); // pussywizard: required so Launch() won't recalculate position from previous spline
16612 Movement::MoveSplineInit init(this);
16613 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
16614 init.SetFacing(GetOrientation());
16615 init.Launch();
16616}

References ClearUnitState(), DisableSpline(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsInWorld(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and UNIT_STATE_MOVING.

Referenced by npc_mograine::npc_mograineAI::AshbringerEvent(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), UtherBatteredHiltEvent::Execute(), WorldSession::HandlePetActionHelper(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), boss_skadi::boss_skadiAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), SetRooted(), boss_hexlord_malacrass::boss_hex_lord_malacrassAI::SpawnAdds(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), Creature::Update(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_janalai::boss_janalaiAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), and boss_illidan_stormrage::boss_illidan_stormrageAI::UpdateAI().

◆ Talk() [1/2]

void Unit::Talk ( std::string_view  text,
ChatMsg  msgType,
Language  language,
float  textRange,
WorldObject const *  target 
)
virtual
21011{
21012 Acore::CustomChatTextBuilder builder(this, msgType, text, language, target);
21015 Cell::VisitWorldObjects(this, worker, textRange);
21016}
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:193
Definition: GridNotifiers.h:592
Definition: GridNotifiers.h:1707
Definition: ChatTextBuilder.h:49

References Cell::VisitWorldObjects().

Referenced by spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), and spell_the_flag_of_ownership::HandleScript().

◆ Talk() [2/2]

void Unit::Talk ( uint32  textId,
ChatMsg  msgType,
float  textRange,
WorldObject const *  target 
)
virtual
21047{
21048 if (!sObjectMgr->GetBroadcastText(textId))
21049 {
21050 LOG_ERROR("entities.unit", "Unit::Talk: `broadcast_text` (ID: {}) was not found", textId);
21051 return;
21052 }
21053
21054 Acore::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target);
21057 Cell::VisitWorldObjects(this, worker, textRange);
21058}
Definition: ChatTextBuilder.h:31

References getGender(), LOG_ERROR, sObjectMgr, and Cell::VisitWorldObjects().

◆ TauntApply()

void Unit::TauntApply ( Unit victim)
14578{
14580
14581 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14582 return;
14583
14584 if (!CanHaveThreatList())
14585 return;
14586
14587 Creature* creature = ToCreature();
14588
14589 if (creature->HasReactState(REACT_PASSIVE))
14590 return;
14591
14592 Unit* target = GetVictim();
14593 if (target && target == taunter)
14594 return;
14595
14596 SetInFront(taunter);
14597 SetGuidValue(UNIT_FIELD_TARGET, taunter->GetGUID());
14598
14599 if (creature->IsAIEnabled)
14600 creature->AI()->AttackStart(taunter);
14601
14602 //m_ThreatMgr.tauntApply(taunter);
14603}
void SetInFront(WorldObject const *target)
Definition: Unit.cpp:20410

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), Object::GetGUID(), Object::GetTypeId(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Player::IsGameMaster(), Object::IsPlayer(), REACT_PASSIVE, Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), TYPEID_UNIT, and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and boss_razorgore::boss_razorgoreAI::OnCharmed().

◆ TauntFadeOut()

void Unit::TauntFadeOut ( Unit taunter)
14608{
14610
14611 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14612 return;
14613
14614 if (!CanHaveThreatList())
14615 return;
14616
14617 Creature* creature = ToCreature();
14618
14619 if (creature->HasReactState(REACT_PASSIVE))
14620 return;
14621
14622 Unit* target = GetVictim();
14623 if (!target || target != taunter)
14624 return;
14625
14627 {
14628 if (creature->IsAIEnabled)
14630 return;
14631 }
14632
14633 target = creature->SelectVictim(); // might have more taunt auras remaining
14634
14635 if (target && target != taunter)
14636 {
14638 SetInFront(target);
14639 if (creature->IsAIEnabled)
14640 creature->AI()->AttackStart(target);
14641 }
14642}
@ EVADE_REASON_NO_HOSTILES
Definition: CreatureAI.h:90
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition: CreatureAI.cpp:197
bool isThreatListEmpty() const
Definition: ThreatMgr.h:225
Unit * SelectVictim()
Definition: Unit.cpp:14646

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), CreatureAI::EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Object::GetGUID(), Object::GetTypeId(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Player::IsGameMaster(), Object::IsPlayer(), ThreatMgr::isThreatListEmpty(), m_ThreatMgr, REACT_PASSIVE, Creature::SelectVictim(), Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), TYPEID_UNIT, and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ TextEmote() [1/2]

◆ TextEmote() [2/2]

void Unit::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

Reimplemented in Player.

21071{
21072 Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
21073}

References CHAT_MSG_MONSTER_EMOTE, CHAT_MSG_RAID_BOSS_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToPet()

◆ ToTempSummon() [1/2]

TempSummon * Unit::ToTempSummon ( )
inline
1742{ if (IsSummon()) return reinterpret_cast<TempSummon*>(this); else return nullptr; }

References IsSummon().

Referenced by CreatureAI::_EnterEvadeMode(), _ExitVehicle(), npc_living_mojo::npc_living_mojoAI::AttackStart(), WorldObject::CanSeeOrDetect(), Spell::CheckCast(), Spell::CheckEffectTarget(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Creature::DespawnOnEvade(), Creature::DespawnOrUnsummon(), npc_bone_spike::npc_bone_spikeAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), ThreatMgr::DoAddThreat(), Spell::EffectScriptEffect(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), npc_raging_flames::FixateRandomTarget(), boss_headless_horseman_head::GetOwner(), GetSpellModOwner(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::GetSummoner(), Creature::GetSummonerGUID(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pilgrims_bounty_pass_generic::HandleDummy(), WorldSession::HandlePetActionHelper(), spell_pri_lightwell::HandleScriptEffect(), spell_q11026_a11051_banish_the_demons::HandleScriptEffect(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), npc_pet_gen_imp_in_a_bottle::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), npc_raging_spirit::npc_raging_spiritAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::npc_pet_dk_ghoulAI::JustDied(), npc_pet_pri_shadowfiend::JustDied(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), npc_collapsing_star::npc_collapsing_starAI::JustSummoned(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::JustSummoned(), boss_supremus::JustSummoned(), Kill(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_netherspite_infernal::KilledUnit(), npc_living_mojo::npc_living_mojoAI::MoveInLineOfSight(), WaypointMovementGenerator< Creature >::MovementInform(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::MovementInform(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_claw_tentacle::npc_claw_tentacle(), npc_eye_tentacle::npc_eye_tentacle(), npc_frost_tomb::npc_frost_tombAI::npc_frost_tombAI(), npc_giant_claw_tentacle::npc_giant_claw_tentacle(), npc_giant_eye_tentacle::npc_giant_eye_tentacle(), npc_midsummer_bonfire::npc_midsummer_bonfire(), npc_midsummer_ribbon_pole_target::npc_midsummer_ribbon_pole_target(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), BattlefieldWG::OnCreatureCreate(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), RemoveAllControlled(), RemoveAllMinionsByEntry(), spell_gen_defend::RemoveDummyFromDriver(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), npc_voidtraveler::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), Spell::SendSpellGo(), Spell::SendSpellStart(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_pilgrims_bounty_plate::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SummonedCreatureDies(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_freya_ward::npc_freya_wardAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::UpdateAI(), npc_feedin_da_goolz::npc_feedin_da_goolzAI::UpdateAI(), Player::VehicleSpellInitialize(), and npc_frosthound::npc_frosthoundAI::WaypointReached().

◆ ToTempSummon() [2/2]

const TempSummon * Unit::ToTempSummon ( ) const
inline
1743{ if (IsSummon()) return reinterpret_cast<const TempSummon*>(this); else return nullptr; }

References IsSummon().

◆ ToTotem()

Totem * Unit::ToTotem ( )
inline
1741{ if (IsTotem()) return reinterpret_cast<Totem*>(this); else return nullptr; }
Definition: Totem.h:51

References IsTotem().

Referenced by _UnapplyAura(), Spell::EffectDestroyAllTotems(), WorldSession::HandleTotemDestroyed(), SetMinion(), Spell::SummonGuardian(), and TotemAI::UpdateAI().

◆ TriggerAurasProcOnEvent() [1/3]

void Unit::TriggerAurasProcOnEvent ( CalcDamageInfo damageInfo)
16458{
16459 DamageInfo dmgInfo = DamageInfo(damageInfo);
16460 TriggerAurasProcOnEvent(nullptr, nullptr, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, 0, 0, damageInfo.procEx, nullptr, &dmgInfo, nullptr);
16461}
void TriggerAurasProcOnEvent(CalcDamageInfo &damageInfo)
Definition: Unit.cpp:16457

References CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::target, and TriggerAurasProcOnEvent().

Referenced by TriggerAurasProcOnEvent().

◆ TriggerAurasProcOnEvent() [2/3]

void Unit::TriggerAurasProcOnEvent ( ProcEventInfo eventInfo,
std::list< AuraApplication * > &  procAuras 
)
16483{
16484 for (std::list<AuraApplication*>::iterator itr = aurasTriggeringProc.begin(); itr != aurasTriggeringProc.end(); ++itr)
16485 {
16486 if (!(*itr)->GetRemoveMode())
16487 (*itr)->GetBase()->TriggerProcOnEvent(*itr, eventInfo);
16488 }
16489}

◆ TriggerAurasProcOnEvent() [3/3]

void Unit::TriggerAurasProcOnEvent ( std::list< AuraApplication * > *  myProcAuras,
std::list< AuraApplication * > *  targetProcAuras,
Unit actionTarget,
uint32  typeMaskActor,
uint32  typeMaskActionTarget,
uint32  spellTypeMask,
uint32  spellPhaseMask,
uint32  hitMask,
Spell spell,
DamageInfo damageInfo,
HealInfo healInfo 
)
16464{
16465 // prepare data for self trigger
16466 ProcEventInfo myProcEventInfo = ProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16467 std::list<AuraApplication*> myAurasTriggeringProc;
16468 GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo);
16469
16470 // prepare data for target trigger
16471 ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16472 std::list<AuraApplication*> targetAurasTriggeringProc;
16473 if (typeMaskActionTarget)
16474 GetProcAurasTriggeredOnEvent(targetAurasTriggeringProc, targetProcAuras, targetProcEventInfo);
16475
16476 TriggerAurasProcOnEvent(myProcEventInfo, myAurasTriggeringProc);
16477
16478 if (typeMaskActionTarget)
16479 TriggerAurasProcOnEvent(targetProcEventInfo, targetAurasTriggeringProc);
16480}
void GetProcAurasTriggeredOnEvent(std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
Definition: Unit.cpp:16427

References GetProcAurasTriggeredOnEvent(), and TriggerAurasProcOnEvent().

◆ UnsummonAllTotems()

void Unit::UnsummonAllTotems ( bool  onDeath = false)
11127{
11128 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
11129 {
11130 if (!m_SummonSlot[i])
11131 {
11132 continue;
11133 }
11134
11135 if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i]))
11136 {
11137 if (OldTotem->IsSummon())
11138 {
11139 if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian()))
11140 {
11141 OldTotem->ToTempSummon()->UnSummon();
11142 }
11143 }
11144 }
11145 }
11146}

References WorldObject::GetMap(), Object::IsPlayer(), m_SummonSlot, and MAX_SUMMON_SLOT.

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ Update()

void Unit::Update ( uint32  time)
overridevirtual

Reimplemented from WorldObject.

384{
385 sScriptMgr->OnUnitUpdate(this, p_time);
386
387 // WARNING! Order of execution here is important, do not change.
388 // Spells must be processed with event system BEFORE they go to _UpdateSpells.
389 // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
390 m_Events.Update(p_time);
391
392 if (!IsInWorld())
393 return;
394
395 // pussywizard:
396 if (GetTypeId() != TYPEID_PLAYER || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate))
397 {
399 {
401 {
403 //ExecuteDelayedUnitRelocationEvent();
405 }
406 else
408 }
410 {
411 if (m_delayed_unit_ai_notify_timer <= p_time)
412 {
415 }
416 else
418 }
419 }
420
421 _UpdateSpells( p_time );
422
423 if (CanHaveThreatList() && GetThreatMgr().isNeedUpdateToClient(p_time))
425
426 // update combat timer only for players and pets (only pets with PetAI)
428 {
429 // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away
430 // targets without stopping half way there and running off.
431 // These flags are reset after target dies or another command is given.
433 {
434 // m_CombatTimer set at aura start and it will be freeze until aura removing
435 if (m_CombatTimer <= p_time)
437 else
438 m_CombatTimer -= p_time;
439 }
440 }
441
444 {
445 while (!extraAttacksTargets.empty())
446 {
447 auto itr = extraAttacksTargets.begin();
448 ObjectGuid targetGuid = itr->first;
449 uint32 count = itr->second;
450 extraAttacksTargets.erase(itr);
451 if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
452 {
454 || victim->IsWithinMeleeRange(this))
455 {
456 HandleProcExtraAttackFor(victim, count);
457 }
458 }
459 }
461 }
462
463 // not implemented before 3.0.2
464 // xinef: if attack time > 0, reduce by diff
465 // if on next update, attack time < 0 assume player didnt attack - set to 0
466 bool suspendAttackTimer = false;
467 bool suspendRangedAttackTimer = false;
469 {
470 for (Spell* spell : m_currentSpells)
471 {
472 if (spell)
473 {
474 if (spell->GetSpellInfo()->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
475 {
476 if (spell->IsChannelActive())
477 {
478 suspendRangedAttackTimer = true;
479 }
480
481 suspendAttackTimer = true;
482 break;
483 }
484 }
485 }
486 }
487
488 if (!suspendAttackTimer)
489 {
490 if (int32 base_attack = getAttackTimer(BASE_ATTACK))
491 {
492 setAttackTimer(BASE_ATTACK, base_attack > 0 ? base_attack - (int32) p_time : 0);
493 }
494
495 if (int32 off_attack = getAttackTimer(OFF_ATTACK))
496 {
497 setAttackTimer(OFF_ATTACK, off_attack > 0 ? off_attack - (int32) p_time : 0);
498 }
499 }
500
501 if (!suspendRangedAttackTimer)
502 {
503 if (int32 ranged_attack = getAttackTimer(RANGED_ATTACK))
504 {
505 setAttackTimer(RANGED_ATTACK, ranged_attack > 0 ? ranged_attack - (int32)p_time : 0);
506 }
507 }
508
509 // update abilities available only for fraction of time
510 UpdateReactives(p_time);
511
515
516 UpdateSplineMovement(p_time);
517 GetMotionMaster()->UpdateMotion(p_time);
518
520}
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition: SharedDefines.h:1315
bool IsEmpty() const
Definition: LinkedList.h:97
void Update(uint32 p_time)
Definition: EventProcessor.cpp:40
void _UpdateSpells(uint32 time)
Definition: Unit.cpp:3804
void UpdateSplineMovement(uint32 t_diff)
Definition: Unit.cpp:576
void UpdateReactives(uint32 p_time)
Definition: Unit.cpp:16854
void ExecuteDelayedUnitAINotifyEvent()
Definition: Unit.cpp:20399
void HandleProcExtraAttackFor(Unit *victim, uint32 count)
Definition: Unit.cpp:2720
void SendThreatListUpdate()
Definition: Unit.cpp:19983
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition: Map.h:389
void UpdateMotion(uint32 diff)
Definition: MotionMaster.cpp:104

References _lastDamagedTargetGuid, _lastExtraAttackSpell, _UpdateSpells(), AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, bRequestForcedVisibilityUpdate, CanHaveThreatList(), ClearInCombat(), ObjectGuid::Empty, ExecuteDelayedUnitAINotifyEvent(), extraAttacksTargets, WorldObject::FindMap(), getAttackTimer(), GetMotionMaster(), GetThreatMgr(), Object::GetTypeId(), ObjectAccessor::GetUnit(), HandleProcExtraAttackFor(), HasUnitState(), HasUnitTypeMask(), HealthAbovePct(), HealthBelowPct(), Map::i_objectsForDelayedVisibility, InvalidateValuesUpdateCache(), IsAlive(), IsControlledByPlayer(), LinkedListHead::IsEmpty(), IsInCombat(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), m_CombatTimer, m_currentSpells, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_Events, m_HostileRefMgr, ModifyAuraState(), OFF_ATTACK, RANGED_ATTACK, SendThreatListUpdate(), setAttackTimer(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_HACK_AND_SLASH, SPELL_SWORD_SPECIALIZATION, sScriptMgr, Object::ToPlayer(), TYPEID_PLAYER, UNIT_MASK_CONTROLABLE_GUARDIAN, UNIT_STATE_CASTING, EventProcessor::Update(), MotionMaster::UpdateMotion(), UpdateReactives(), and UpdateSplineMovement().

Referenced by Creature::Update(), and Player::Update().

◆ UpdateAllResistances()

void Unit::UpdateAllResistances ( )
virtual

◆ UpdateAllStats()

virtual bool Unit::UpdateAllStats ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

◆ UpdateArmor()

virtual void Unit::UpdateArmor ( )
pure virtual

◆ UpdateAttackPowerAndDamage()

virtual void Unit::UpdateAttackPowerAndDamage ( bool  ranged = false)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateAuraForGroup()

void Unit::UpdateAuraForGroup ( uint8  slot)
17084{
17085 if (slot >= MAX_AURAS) // slot not found, return
17086 return;
17087 if (Player* player = ToPlayer())
17088 {
17089 if (player->GetGroup())
17090 {
17091 player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
17092 player->SetAuraUpdateMaskForRaid(slot);
17093 }
17094 }
17095 else if (GetTypeId() == TYPEID_UNIT && IsPet())
17096 {
17097 Pet* pet = ((Pet*)this);
17098 if (pet->isControlled())
17099 {
17100 Unit* owner = GetOwner();
17101 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
17102 {
17104 pet->SetAuraUpdateMaskForRaid(slot);
17105 }
17106 }
17107 }
17108}
#define MAX_AURAS
Definition: SpellAuraDefines.h:21
@ GROUP_UPDATE_FLAG_PET_AURAS
Definition: Group.h:118
@ GROUP_UPDATE_FLAG_AURAS
Definition: Group.h:109
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition: Pet.h:137

References Player::GetGroup(), GetOwner(), Object::GetTypeId(), GROUP_UPDATE_FLAG_AURAS, GROUP_UPDATE_FLAG_PET_AURAS, Pet::isControlled(), IsPet(), Object::IsPlayer(), MAX_AURAS, Pet::SetAuraUpdateMaskForRaid(), Player::SetGroupUpdateFlag(), Object::ToPlayer(), and TYPEID_UNIT.

Referenced by RemoveVisibleAura(), and SetVisibleAura().

◆ UpdateCharmAI()

void Unit::UpdateCharmAI ( )
15699{
15700 if (IsPlayer())
15701 return;
15702
15703 if (i_disabledAI) // disabled AI must be primary AI
15704 {
15705 if (!IsCharmed())
15706 {
15707 delete i_AI;
15709 i_disabledAI = nullptr;
15710 }
15711 }
15712 else
15713 {
15714 if (IsCharmed())
15715 {
15717 if (isPossessed() || IsVehicle())
15718 i_AI = new PossessedAI(ToCreature());
15719 else
15720 i_AI = new PetAI(ToCreature());
15721 }
15722 }
15723}
Definition: PassiveAI.h:37
Definition: PetAI.h:47

References i_AI, i_disabledAI, IsCharmed(), Object::IsPlayer(), isPossessed(), IsVehicle(), and Object::ToCreature().

Referenced by Creature::Update().

◆ UpdateDamagePhysical()

void Unit::UpdateDamagePhysical ( WeaponAttackType  attType)
virtual

Reimplemented in Guardian, and Totem.

61{
62 float totalMin = 0.f;
63 float totalMax = 0.f;
64
65 float tmpMin, tmpMax;
66 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
67 {
68 CalculateMinMaxDamage(attType, false, true, tmpMin, tmpMax, i);
69 totalMin += tmpMin;
70 totalMax += tmpMax;
71 }
72
73 switch (attType)
74 {
75 case BASE_ATTACK:
76 default:
79 break;
80 case OFF_ATTACK:
83 break;
84 case RANGED_ATTACK:
87 break;
88 }
89}
void SetStatFloatValue(uint16 index, float value)
Definition: Object.cpp:790

References BASE_ATTACK, CalculateMinMaxDamage(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, Object::SetStatFloatValue(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by Player::_ApplyAmmoBonuses(), Player::_ApplyWeaponDamage(), boss_twin_valkyrAI::boss_twin_valkyrAI(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleModAttackSpeed(), HandleStatModifier(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::npc_toc_enh_shamanAI(), Player::RemoveAmmo(), Creature::SetCanDualWield(), Creature::UpdateAttackPowerAndDamage(), and Player::UpdateAttackPowerAndDamage().

◆ UpdateHeight()

void Unit::UpdateHeight ( float  newZ)

Only server-side height update, does not broadcast to client.

19977{
19979 if (IsVehicle())
19981}
void RelocatePassengers()
Definition: Vehicle.cpp:496

References Position::GetPositionX(), Position::GetPositionY(), GetVehicleKit(), IsVehicle(), Position::Relocate(), and Vehicle::RelocatePassengers().

Referenced by npc_dancing_flames::npc_dancing_flamesAI::Reset(), and SetHover().

◆ UpdateInterruptMask()

void Unit::UpdateInterruptMask ( )
742{
743 m_interruptMask = 0;
744 for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i)
745 m_interruptMask |= (*i)->GetBase()->GetSpellInfo()->AuraInterruptFlags;
746
748 if (spell->getState() == SPELL_STATE_CASTING)
749 m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
750}

References CURRENT_CHANNELED_SPELL, m_currentSpells, m_interruptableAuras, m_interruptMask, and SPELL_STATE_CASTING.

Referenced by _UnapplyAura(), Spell::finish(), and RemoveAurasWithInterruptFlags().

◆ UpdateMaxHealth()

virtual void Unit::UpdateMaxHealth ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateMaxPower()

virtual void Unit::UpdateMaxPower ( Powers  power)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateObjectVisibility()

◆ UpdateOrientation()

void Unit::UpdateOrientation ( float  orientation)

Only server-side orientation update, does not broadcast to client.

19969{
19970 SetOrientation(orientation);
19971 if (IsVehicle())
19973}

References GetVehicleKit(), IsVehicle(), Vehicle::RelocatePassengers(), and Position::SetOrientation().

Referenced by Spell::UpdateChanneledTargetList(), and UpdatePosition().

◆ UpdatePosition() [1/2]

bool Unit::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline

◆ UpdatePosition() [2/2]

bool Unit::UpdatePosition ( float  x,
float  y,
float  z,
float  ang,
bool  teleport = false 
)
virtual

Reimplemented in Player.

19931{
19932 if (!Acore::IsValidMapCoord(x, y, z, orientation))
19933 return false;
19934
19935 float old_orientation = GetOrientation();
19936 float current_z = GetPositionZ();
19937 bool turn = (old_orientation != orientation);
19938 bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || current_z != z);
19939
19940 if (!GetVehicle())
19941 {
19942 uint32 mask = 0;
19943 if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;
19944 if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;
19945 if (mask)
19947 }
19948
19949 if (relocated)
19950 {
19951 if (IsPlayer())
19952 GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
19953 else
19954 GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation);
19955 }
19956 else if (turn)
19957 {
19958 UpdateOrientation(orientation);
19959
19960 if (IsPlayer() && ToPlayer()->GetFarSightDistance())
19962 }
19963
19964 return (relocated || turn);
19965}
bool IsValidMapCoord(float c)
Definition: GridDefines.h:216
void UpdateOrientation(float orientation)
Only server-side orientation update, does not broadcast to client.
Definition: Unit.cpp:19968
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition: Map.cpp:1000
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition: Map.cpp:1022

References AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, Map::CreatureRelocation(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetVehicle(), Object::IsPlayer(), Acore::IsValidMapCoord(), Map::PlayerRelocation(), RemoveAurasWithInterruptFlags(), Object::ToCreature(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdateOrientation().

Referenced by npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_taldaram::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveRootAck(), WorldSession::HandleMoveUnRootAck(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), NearTeleportTo(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_skadi::boss_skadiAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_escortAI::SetNextWaypoint(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), Player::UpdatePosition(), and UpdateSplinePosition().

◆ UpdateReactives()

void Unit::UpdateReactives ( uint32  p_time)
16855{
16856 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
16857 {
16858 ReactiveType reactive = ReactiveType(i);
16859
16860 if (!m_reactiveTimer[reactive])
16861 continue;
16862
16863 if (m_reactiveTimer[reactive] <= p_time)
16864 {
16865 m_reactiveTimer[reactive] = 0;
16866
16867 switch (reactive)
16868 {
16869 case REACTIVE_DEFENSE:
16872 break;
16876 break;
16877 case REACTIVE_OVERPOWER:
16879 {
16881 }
16882 break;
16884 if (IsHunterPet())
16886 break;
16887 default:
16888 break;
16889 }
16890 }
16891 else
16892 {
16893 m_reactiveTimer[reactive] -= p_time;
16894 }
16895 }
16896}
ReactiveType
Definition: Unit.h:587

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), IsHunterPet(), m_reactiveTimer, MAX_REACTIVE, ModifyAuraState(), REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, and REACTIVE_WOLVERINE_BITE.

Referenced by Update().

◆ UpdateResistances()

virtual void Unit::UpdateResistances ( uint32  school)
pure virtual

Implemented in Creature, Player, and Totem.

Referenced by HandleStatModifier(), and UpdateAllResistances().

◆ UpdateSpeed()

void Unit::UpdateSpeed ( UnitMoveType  mtype,
bool  forced 
)
Todo:
possible affect only on MOVE_RUN
14166{
14167 int32 main_speed_mod = 0;
14168 float stack_bonus = 1.0f;
14169 float non_stack_bonus = 1.0f;
14170
14171 switch (mtype)
14172 {
14173 // Only apply debuffs
14174 case MOVE_FLIGHT_BACK:
14175 case MOVE_RUN_BACK:
14176 case MOVE_SWIM_BACK:
14177 case MOVE_WALK:
14178 break;
14179 case MOVE_RUN:
14180 {
14181 if (IsMounted()) // Use on mount auras
14182 {
14186 }
14187 else
14188 {
14192 }
14193 break;
14194 }
14195 case MOVE_SWIM:
14196 {
14197 // xinef: check for forced_speed_mod of sea turtle
14199 for (Unit::AuraEffectList::const_iterator itr = swimAuras.begin(); itr != swimAuras.end(); ++itr)
14200 {
14201 // xinef: sea turtle only, it is not affected by any increasing / decreasing effects
14202 if ((*itr)->GetId() == 64731 /*SPELL_SEA_TURTLE*/)
14203 {
14204 SetSpeed(mtype, AddPct(non_stack_bonus, (*itr)->GetAmount()), forced);
14205 return;
14206 }
14207 else if (
14208 // case: increase speed
14209 ((*itr)->GetAmount() > 0 && (*itr)->GetAmount() > main_speed_mod) ||
14210 // case: decrease speed
14211 ((*itr)->GetAmount() < 0 && (*itr)->GetAmount() < main_speed_mod)
14212 )
14213 {
14214 main_speed_mod = (*itr)->GetAmount();
14215 }
14216 }
14217 break;
14218 }
14219 case MOVE_FLIGHT:
14220 {
14221 if (GetTypeId() == TYPEID_UNIT && IsControlledByPlayer()) // not sure if good for pet
14222 {
14225
14226 // for some spells this mod is applied on vehicle owner
14227 int32 owner_speed_mod = 0;
14228
14229 if (Unit* owner = GetCharmer())
14230 owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED);
14231
14232 main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
14233 }
14234 else if (IsMounted())
14235 {
14238 }
14239 else // Use not mount (shapeshift for example) auras (should stack)
14241
14243
14244 // Update speed for vehicle if available
14245 if (IsPlayer() && GetVehicle())
14247 break;
14248 }
14249 default:
14250 LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type ({})", mtype);
14251 return;
14252 }
14253
14254 // now we ready for speed calculation
14255 float speed = std::max(non_stack_bonus, stack_bonus);
14256 if (main_speed_mod)
14257 AddPct(speed, main_speed_mod);
14258
14259 switch (mtype)
14260 {
14261 case MOVE_RUN:
14262 case MOVE_SWIM:
14263 case MOVE_FLIGHT:
14264 {
14265 // Set creature speed rate
14266 if (GetTypeId() == TYPEID_UNIT)
14267 {
14268 if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
14269 {
14270 // contant value for player pets
14271 speed *= 1.15f;
14272 }
14273 else
14274 {
14275 speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
14276 }
14277 }
14278
14279 // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
14282 {
14283 if (Creature* creature = ToCreature())
14284 {
14285 uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask;
14286 if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1)))
14287 break;
14288 }
14289
14290 // Use speed from aura
14291 float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
14292 if (speed > max_speed)
14293 speed = max_speed;
14294 }
14295 break;
14296 }
14297 default:
14298 break;
14299 }
14300
14301 int32 slowFromHealth = 0;
14302 Creature* creature = ToCreature();
14303 // ignore pets, player owned vehicles, and mobs immune to snare
14304 if (creature
14305 && !IsPet()
14306 && !(IsControlledByPlayer() && IsVehicle())
14308 && !(creature->IsDungeonBoss()))
14309 {
14310 // 1.6% for each % under 30.
14311 // use min(0, health-30) so that we don't boost mobs above 30.
14312 slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f)));
14313 }
14314
14315 if (slowFromHealth)
14316 {
14317 AddPct(speed, slowFromHealth);
14318 }
14319
14320 // Apply strongest slow aura mod to speed
14322 if (slow)
14323 AddPct(speed, slow);
14324
14325 if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
14326 {
14327 float base_speed = (GetTypeId() == TYPEID_UNIT ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f);
14328 float min_speed = base_speed * (minSpeedMod / 100.0f);
14329 if (speed < min_speed)
14330 speed = min_speed;
14331 }
14332
14333 SetSpeed(mtype, speed, forced);
14334}
@ SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:274
@ SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
Definition: SpellAuraDefines.h:271
@ SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
Definition: SpellAuraDefines.h:272
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition: SpellAuraDefines.h:94
@ SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:235
@ SPELL_AURA_MOD_SPEED_NOT_STACK
Definition: SpellAuraDefines.h:234
@ SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED
Definition: SpellAuraDefines.h:269
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
Definition: SpellAuraDefines.h:121
@ SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS
Definition: SpellAuraDefines.h:273
@ SPELL_AURA_MOD_MINIMUM_SPEED
Definition: SpellAuraDefines.h:368
@ SPELL_AURA_MOD_SPEED_ALWAYS
Definition: SpellAuraDefines.h:192
@ SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
Definition: SpellAuraDefines.h:193
@ SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
Definition: SpellAuraDefines.h:95
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
Definition: SpellAuraDefines.h:254
@ MECHANIC_DAZE
Definition: SharedDefines.h:1352
float speed_run
Definition: CreatureData.h:204
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition: Unit.cpp:14341

References AddPct(), baseMoveSpeed, GetAuraEffectsByType(), GetCharmer(), Creature::GetCreatureTemplate(), GetHealthPct(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), Object::GetTypeId(), GetVehicle(), GetVehicleBase(), Creature::HasMechanicTemplateImmunity(), IsControlledByPlayer(), Creature::IsDungeonBoss(), IsMounted(), IsPet(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MECHANIC_DAZE, MECHANIC_SNARE, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_WALK, playerBaseMoveSpeed, SetSpeed(), CreatureTemplate::speed_run, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK, SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED, SPELL_AURA_MOD_MINIMUM_SPEED, SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, SPELL_AURA_MOD_SPEED_ALWAYS, SPELL_AURA_MOD_SPEED_NOT_STACK, SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, Object::ToCreature(), ToPet(), TYPEID_UNIT, and UpdateSpeed().

Referenced by Creature::DoFleeToGetAssistance(), AuraEffect::HandleAuraModDecreaseSpeed(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModIncreaseSpeed(), AuraEffect::HandleAuraModIncreaseSwimSpeed(), AuraEffect::HandleAuraModUseNormalSpeed(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), RemoveCharmedBy(), SetHealth(), SetInCombatState(), SetSpeed(), and UpdateSpeed().

◆ UpdateSplineMovement()

void Unit::UpdateSplineMovement ( uint32  t_diff)
private
577{
578 if (movespline->Finalized())
579 return;
580
581 // xinef: process movementinform
582 // this code cant be placed inside EscortMovementGenerator, because we cant delete active MoveGen while it is updated
583 SplineHandler handler(this);
584 movespline->updateState(t_diff, handler);
585 // Xinef: Spline was cleared by StopMoving, return
586 if (!movespline->Initialized())
587 {
589 return;
590 }
591
592 bool arrived = movespline->Finalized();
593
594 if (arrived)
595 {
597
600 }
601
602 // pussywizard: update always! not every 400ms, because movement generators need the actual position
603 //m_movesplineTimer.Update(t_diff);
604 //if (m_movesplineTimer.Passed() || arrived)
606}
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition: UnitDefines.h:26
Definition: Unit.cpp:556
uint8 GetAnimationType() const
Definition: MoveSpline.h:125
void updateState(int32 difftime, UpdateHandler &handler)
Definition: MoveSpline.h:98
bool HasAnimation() const
Definition: MoveSpline.h:124

References DisableSpline(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::GetAnimationType(), Object::GetTypeId(), Movement::MoveSpline::HasAnimation(), Movement::MoveSpline::Initialized(), IsAlive(), movespline, Object::SetByteValue(), TYPEID_UNIT, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, UpdateSplinePosition(), and Movement::MoveSpline::updateState().

Referenced by Update().

◆ UpdateSplinePosition()

void Unit::UpdateSplinePosition ( )
private
609{
610 //static uint32 const positionUpdateDelay = 400;
611
612 //m_movesplineTimer.Reset(positionUpdateDelay);
614
616 {
618 pos.m_positionX = loc.x;
619 pos.m_positionY = loc.y;
620 pos.m_positionZ = loc.z;
622
623 if (TransportBase* transport = GetDirectTransport())
624 transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
625 }
626
627 // Xinef: if we had spline running update orientation along with position
628 //if (HasUnitState(UNIT_STATE_CANNOT_TURN))
629 // loc.orientation = GetOrientation();
630
631 if (IsPlayer())
632 UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
633 else
634 ToCreature()->SetPosition(loc.x, loc.y, loc.z, loc.orientation);
635}
void SetPosition(float x, float y, float z, float o)
Definition: Creature.cpp:3123
Position pos
Definition: Object.h:295
float m_positionZ
Definition: Position.h:58
float m_positionX
Definition: Position.h:56
float m_positionY
Definition: Position.h:57
TransportBase * GetDirectTransport() const
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition: Unit.cpp:18670
Definition: VehicleDefines.h:106
Definition: MoveSpline.h:27
float orientation
Definition: MoveSpline.h:33
Location ComputePosition() const
Definition: MoveSpline.cpp:26
bool onTransport
Definition: MoveSpline.h:127

References Movement::MoveSpline::ComputePosition(), GetDirectTransport(), Object::IsPlayer(), WorldObject::m_movementInfo, Position::m_positionX, Position::m_positionY, Position::m_positionZ, movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, MovementInfo::TransportInfo::pos, Position::SetOrientation(), Creature::SetPosition(), Object::ToCreature(), MovementInfo::transport, and UpdatePosition().

Referenced by StopMoving(), and UpdateSplineMovement().

◆ UpdateStats()

virtual bool Unit::UpdateStats ( Stats  stat)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ Whisper() [1/2]

void Unit::Whisper ( std::string_view  text,
Language  language,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21034{
21035 if (!target)
21036 {
21037 return;
21038 }
21039
21041 WorldPacket data;
21042 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
21043 target->SendDirectMessage(&data);
21044}
LocaleConstant
Definition: Common.h:64
@ CHAT_MSG_MONSTER_WHISPER
Definition: SharedDefines.h:3167
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition: SharedDefines.h:3194
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition: Chat.cpp:267
LocaleConstant GetSessionDbLocaleIndex() const
Definition: WorldSession.h:498

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), and Player::SendDirectMessage().

Referenced by npc_commandscript::HandleNpcWhisperCommand(), Map::ScriptsProcess(), and boss_zuramat::boss_zuramatAI::UpdateAI().

◆ Whisper() [2/2]

void Unit::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21076{
21077 if (!target)
21078 {
21079 return;
21080 }
21081
21082 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
21083 if (!bct)
21084 {
21085 LOG_ERROR("entities.unit", "Unit::Whisper: `broadcast_text` was not {} found", textId);
21086 return;
21087 }
21088
21090 WorldPacket data;
21091 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
21092 target->SendDirectMessage(&data);
21093}
Definition: ObjectMgr.h:435
std::string const & GetText(LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false) const
Definition: ObjectMgr.h:457

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, getGender(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, Player::SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Unit::Yell ( std::string_view  text,
Language  language,
WorldObject const *  target = nullptr 
)
virtual

◆ Yell() [2/2]

void Unit::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21066{
21067 Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
21068}

References CHAT_MSG_MONSTER_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Member Data Documentation

◆ _charmThreatInfo

CharmThreatMap Unit::_charmThreatInfo
protected

Referenced by RemoveCharmedBy().

◆ _instantCast

bool Unit::_instantCast
protected

◆ _isWalkingBeforeCharm

bool Unit::_isWalkingBeforeCharm
private

Are we walking before we were charmed?

Referenced by SetCharm(), and Unit().

◆ _lastDamagedTargetGuid

◆ _lastExtraAttackSpell

uint32 Unit::_lastExtraAttackSpell
private

◆ _lastLiquid

LiquidTypeEntry const* Unit::_lastLiquid
protected

◆ _oldFactionId

uint32 Unit::_oldFactionId
private

faction before charm

Referenced by GetOldFactionId(), RemoveCharmedBy(), SetCharmedBy(), and Unit().

◆ _redirectThreatInfo

◆ _valuesUpdateCache

ValuesUpdateCache Unit::_valuesUpdateCache
private

◆ bRequestForcedVisibilityUpdate

◆ extraAttacksTargets

std::unordered_map<ObjectGuid , uint32 > Unit::extraAttacksTargets
private

Referenced by AddExtraAttacks(), and Update().

◆ i_AI

◆ i_disabledAI

UnitAI * Unit::i_disabledAI
protected

Referenced by UpdateCharmAI().

◆ i_motionMaster

MotionMaster* Unit::i_motionMaster
protected

Referenced by GetMotionMaster(), and ~Unit().

◆ IsAIEnabled

◆ m_appliedAuras

◆ m_applyResilience

bool Unit::m_applyResilience
protected

◆ m_attackers

◆ m_attacking

Unit* Unit::m_attacking
protected

◆ m_attackTimer

◆ m_auraModifiersGroup

◆ m_auraStateAuras

◆ m_auraUpdateIterator

AuraMap::iterator Unit::m_auraUpdateIterator
protected

◆ m_AutoRepeatFirstCast

bool Unit::m_AutoRepeatFirstCast
protected

◆ m_baseSpellCritChance

◆ m_canDualWield

bool Unit::m_canDualWield

◆ m_canModifyStats

bool Unit::m_canModifyStats
protected

◆ m_charmInfo

◆ m_cleanupDone

bool Unit::m_cleanupDone
private

◆ m_CombatTimer

uint32 Unit::m_CombatTimer
private

◆ m_ComboPointHolders

std::unordered_set<Unit*> Unit::m_ComboPointHolders
private

◆ m_comboPoints

int8 Unit::m_comboPoints
private

◆ m_comboTarget

◆ m_Controlled

◆ m_ControlledByPlayer

bool Unit::m_ControlledByPlayer

◆ m_CreatedByPlayer

bool Unit::m_CreatedByPlayer

◆ m_createStats

float Unit::m_createStats[MAX_STATS]
protected

◆ m_currentSpells

◆ m_deathState

◆ m_delayed_unit_ai_notify_timer

uint16 Unit::m_delayed_unit_ai_notify_timer

Referenced by Unit(), and Update().

◆ m_delayed_unit_relocation_timer

uint16 Unit::m_delayed_unit_relocation_timer

Referenced by Unit(), Player::Update(), and Update().

◆ m_Diminishing

◆ m_duringRemoveFromWorld

bool Unit::m_duringRemoveFromWorld
private

◆ m_dynObj

◆ m_Events

EventProcessor Unit::m_Events

Referenced by _ExitVehicle(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), CharmInfo::AddSpellToActionBar(), Spell::AddUnitTarget(), spell_sindragosa_ice_tomb_trap_aura::AfterApply(), Creature::CallAssistance(), CastDelayedSpellWithPeriodicAmount(), boss_murmur::CastSupressionOOC(), CleanupBeforeRemoveFromMap(), boss_romulo::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), boss_julianne::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), boss_cthun::DoAction(), boss_ouro::Emerge(), SpellEvent::Execute(), BattleExperienceEvent::Execute(), UtherBatteredHiltEvent::Execute(), TriggerWickedSpirit::Execute(), lapseTeleport::Execute(), PartyTimeEmoteEvent::Execute(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), Creature::ForcedDespawn(), WorldSession::HandleAuctionListOwnerItems(), spell_item_party_time::HandleEffectApply(), spell_alar_flame_quills::HandlePeriodic(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_nerubian_burrower::npc_nerubian_burrowerAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), npc_xt002_boombot::npc_xt002_boombotAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_murmur::JustEngagedWith(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::JustEngagedWith(), boss_mother_shahraz::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), boss_kiljaeden::boss_kiljaedenAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_sindragosa::boss_sindragosaAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::JustSummoned(), npc_risen_archmage::npc_risen_archmageAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_gurtogg_bloodboil::boss_gurtogg_bloodboilAI::KilledUnit(), boss_essence_of_suffering::boss_essence_of_sufferingAI::KilledUnit(), boss_essence_of_desire::boss_essence_of_desireAI::KilledUnit(), boss_essence_of_anger::boss_essence_of_angerAI::KilledUnit(), Creature::ModifyThreatPercentTemp(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_captain_skarloc::MovementInform(), boss_ayamiss::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), npc_kalecgos::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), boss_ghazan::MovementInform(), spell_halion_twilight_realm_aura::OnApply(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), go_main_chambers_access_panel::OnGossipHello(), spell_halion_leave_twilight_realm_aura::OnRemove(), at_cthun_stomach_exit::OnTrigger(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnUnitDeath(), npc_hyldsmeet_protodrake::npc_hyldsmeet_protodrakeAI::PassengerBoarded(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), npc_hive_zara_swarmer::PathEndReached(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), SmartScript::ProcessAction(), Spell::RecalculateDelayMomentForDst(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::Reset(), boss_mother_shahraz::Reset(), boss_najentus::Reset(), NPCStaveQuestAI::ResetState(), npc_gunship_boarding_addAI::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::SummonedCreatureDies(), boss_hydross_the_unstable::SummonMovementInform(), boss_hydross_the_unstable::SummonTaintedElementalOOC(), CreatureAI::Talk(), TempSummon::UnSummon(), Totem::UnSummon(), spell_illidari_council_deadly_strike_aura::Update(), Update(), boss_felmyst::boss_felmystAI::UpdateAI(), and boss_anomalus::boss_anomalusAI::UpdateAI().

◆ m_extraAttacks

uint32 Unit::m_extraAttacks

◆ m_FollowingRefMgr

FollowerRefMgr Unit::m_FollowingRefMgr
private

Referenced by addFollower().

◆ m_gameObj

◆ m_HostileRefMgr

HostileRefMgr Unit::m_HostileRefMgr
private

◆ m_interruptableAuras

◆ m_interruptMask

◆ m_last_notify_mstime

uint32 Unit::m_last_notify_mstime

◆ m_last_notify_position

◆ m_lastManaUse

uint32 Unit::m_lastManaUse
private

◆ m_lastSanctuaryTime

uint32 Unit::m_lastSanctuaryTime

◆ m_modAttackSpeedPct

◆ m_modAuras

◆ m_modMeleeHitChance

◆ m_modRangedHitChance

◆ m_modSpellHitChance

◆ m_movedByPlayer

◆ m_ObjectSlot

◆ m_ownedAuras

◆ m_petAuras

PetAuraSet Unit::m_petAuras

◆ m_procDeep

int32 Unit::m_procDeep
protected

Referenced by CanProc(), and SetCantProc().

◆ m_race

uint8 Unit::m_race
protected

◆ m_reactiveTimer

uint32 Unit::m_reactiveTimer[MAX_REACTIVE]
protected

◆ m_realRace

uint8 Unit::m_realRace
protected

◆ m_regenTimer

◆ m_removedAuras

AuraList Unit::m_removedAuras
protected

◆ m_removedAurasCount

uint32 Unit::m_removedAurasCount
protected

◆ m_rootTimes

uint32 Unit::m_rootTimes
protected

Referenced by SetRooted(), and Unit().

◆ m_scAuras

AuraList Unit::m_scAuras
protected

Referenced by GetSingleCastAuras().

◆ m_sharedVision

◆ m_speed_rate

float Unit::m_speed_rate[MAX_MOVE_TYPE]
protected

◆ m_spellImmune

◆ m_state

uint32 Unit::m_state
private

◆ m_SummonSlot

◆ m_ThreatMgr

◆ m_threatModifier

float Unit::m_threatModifier[MAX_SPELL_SCHOOL]

◆ m_transform

uint32 Unit::m_transform
protected

Referenced by getTransForm(), setTransForm(), and Unit().

◆ m_unitTypeMask

◆ m_vehicle

◆ m_vehicleKit

Vehicle* Unit::m_vehicleKit
protected

◆ m_visibleAuras

◆ m_weaponDamage

◆ movespline

◆ NeedChangeAI

bool Unit::NeedChangeAI

◆ SafeUnitPointerSet

std::set<SafeUnitPointer*> Unit::SafeUnitPointerSet